2017-11-07 24 views
0

Mike Hyller와 다른 블로그에서 작성한 nested sets 참조 문서에서 RDBMS에서 계층 구조를 관리하는 방법을 이해할 수있었습니다. 내 프로젝트 중 하나의 모델을 성공적으로 구현할 수있었습니다. 현재 계층 구조가있는 문제에 대해 작업 중이지만 노드는 아래쪽에서 작성됩니다. MySQL을 사용하고 있습니다.중첩 세트 - 상향 접근법

10 개체가 있다고 가정 해 봅시다. 테이블에 처음으로 행을 만듭니다. 그런 다음 중첩 된 집합 모델을 구현하는 데 필요한 왼쪽 및 오른쪽 값이있는 테이블이 있습니다. 그래서이 테이블에서이 10 개의 객체를 2 개의 집합, 즉 2 개의 봉지, 하나의 봉지에 5 개의 객체 및 하나의 봉지에있는 다른 5 개의 객체 (일부 논리에 근거)로 그룹화합니다. 이제이 두 봉지는 함께 묶여 더 큰 봉지를 형성합니다. 마찬가지로, 그러한 봉지는 함께 그룹화되어 큰 컨테이너를 형성한다.

여기 예제를 얻으려는 아이디어를 얻으려는 본인의 예가 분명하기를 바랍니다. 이것은 위에서 세트를 빌드하는 전통적인 중첩 세트 모델을 적용하는 것과 반대입니다.

중첩 세트를 여기에 적용 할 수 있는지 제안 해주세요. 그렇다면 삽입하는 동안 업데이트 쿼리를 변경하여 전체 계층 구조를 형성하기에 충분합니까? 제안하지 않으면 이러한 문제를 해결하기 위해 어떤 다른 기술을 사용할 수 있습니까?

답변

1

중첩 세트 모델은 겹치지 않는 한 모든 계층에서 작동합니다 (예 : 한 자녀는 최대 한 개의 상위를 가질 수 있음).

모델에 사전 정의 된 계층 구조 ("개체", "가방"및 "컨테이너"는 속성이 다른 엔티티)가있는 것 같습니다. 실제로 그렇다면 중첩 된 집합이 전혀 필요하지 않으므로 외래 키 제약 조건의 간단한 집합만으로 충분할 것입니다.

"가방"을 "컨테이너"로 승격시킬 수 있거나 다른 "컨테이너"를 포함하는 "컨테이너"가있을 수있는 경우가 아니라면, 어떤 종류의 실제로 계층 모델이며 중첩 된 집합도 하나의 역할을 할 수 있습니다. 하나는 "가방"또는 "컨테이너"또는 참조를 추가하는 것입니다 구현하는

한 가지 방법은 무엇이든 "객체"에 대한 귀하의 왼쪽과 오른쪽 값을 보유하고있는 테이블 :

CREATE TABLE nested_sets 
    (
    ref BIGINT NOT NULL, 
    type INT NOT NULL -- 1 = object, 2 = set, 3 = bag 
    left BIGINT, 
    right BIGINT 
    ) 

INSERT 
INTO nested_sets 
VALUES (1, 1, 1, 1), 
     (2, 1, 2, 2), 
     (3, 1, 3, 3), -- 3 objects in bag 1 
     (4, 1, 4, 4), 
     (5, 1, 5, 5), 
     (6, 1, 6, 6), -- 3 objects in bag 2 
     (1, 2, 1, 3), -- bag 1, containing objects 1 to 3 
     (2, 2, 4, 6), -- bag 2, containing objects 4 to 6 
     (1, 3, 1, 6), -- container 1, containing bags 1 and 2 and, by extension, objects 1 to 6 

당신은 할 수있다 또한 테이블에서 엔티티를 설명하는 주 테이블로 leftright 필드를 이동 시키거나 모든 엔티티를 단일 테이블로 이동하려고 할 수 있습니다. 이것은 "가방", "컨테이너"및 "오브젝트"의 정의가 얼마나 엄격한 지에 달려 있습니다.