2010-04-07 2 views
10

나는 여기 내 테이블의 구조입니다, 트리 GUI 구성 요소에 대한 데이터를 표현하는 MySQL의 테이블이 있습니다계층 적 mysql 테이블에서 노드의 부모를 모두 선택하는 방법은 무엇입니까?

treeTable ( 
    id INT NOT NULL PRIMARY KEY, 
    parentId INT, 
    name VARCHAR(255) 
); 

parentId는 자체 참조 외래 키입니다.

이제 노드 ID를 가져 와서 그 노드와 그 부모를 모두 포함하는 결과 집합을 반환하는 저장 프로 시저를 작성하려고합니다.

1, null, 'root' 
2, 1 , 'level_1' 
3, 2 , 'level_2' 

가 지금은 노드 3의 모든 부모 노드 싶어 (노드 1, 2) 모든 나무를 포함한 결과 세트를 반환 : 예를 들어

, 내 테이블이 데이터로 채워진 것으로 가정 기록. 아무도 나를 도와 줄 수 있니?

+0

보면 : [계층 데이터 인 투 - MySQL] [1] [1] : http://stackoverflow.com/questions/1085287/hierarchical-data-in- MySQL –

답변

2

좋은 질문입니다. 오라클에서는 CONNECT BY과 같은 것을 사용할 것입니다.

MySQL을 사용하고 있으므로 데이터 구조를 변경하여 해당 쿼리에 효율적으로 응답 할 것을 제안합니다. Here은 몇 가지 아이디어입니다.

1

There was a similar discussion이 문제를 해결하는 데 도움이 될 수 있습니다.

루트 노드 (부모가 null 임)에 도달 할 때까지 데이터를 반복적으로 검색하여이 문제를 공격 할 수 있다고 생각합니다. 처음에는 저장 프로 시저 외부에서이 작업을 수행 할 수도 있었지만 (검색된 행에 null 부모가있을 때까지 반복적으로 호출), 여기서 참조한 페이지의 "클로저 테이블"솔루션은 훌륭한 솔루션처럼 보입니다.

1

materialized paths도 있습니다. 아주 단순한 개념은 실제로 데이터베이스에 무관심합니다. 중첩 된 세트와 달리 인서트 등을 훨씬 쉽게 관리 할 수 ​​있습니다. 삽입하기 전에 왼쪽/오른쪽 노드 등을 알 필요가 없습니다.

1

MySQL은 테이블 반환 함수 18.2.1. Stored Routine Syntax (임의의 결과 집합을 반환 할 수 있어야합니다)을 지원하지 않습니다.

그들없이

당신은 세 가지 선택이 있습니다

  1. 이 고정 된 최대 깊이에 나무 쿼리를 풀다 및 계층 구조에서 허용 중첩을 제한, 임시 테이블에 데이터를 작성하는 루프를 사용
  2. 및 결과를 호출자에게 반환하는 규칙을 소개합니다. 재진입을 고려해야합니다. 또는
  3. 은 각 구성 요소의 모든 조상을 지원 테이블 (그림)에 포함시키고 treeTable에서 트리거로 유지함으로써 결과를 사전 계산합니다. 이렇게하면 저장 프로 시저가 parentTable의 행을 적절하게 필터링하여 반환합니다. 효율적인 액세스를 위해 복합 기본 키와 가능한 인덱스를 만들어야합니다.

세 번째 옵션의 행 수가 매우 적어 성능이 좋고 인위적인 제한을 피할 수 있습니다.

parentTable (
    id INT NOT NULL, 
    parentId INT NOT NULL 
); 

데이터가 크게 정적 인이 응용 프로그램에서는 중첩 된 방식을 사용하는 것이 좋습니다. 급속하게 변화하는 데이터 세트는 I/O 성능에 영향을 미치기 시작할 것입니다. 테이블의 평균 행 수는 삽입 또는 삭제마다 업데이트되기 때문입니다. 이 주제에

관련 문제