2010-08-02 3 views
3

에 모범 사례 나는 가능한 한 명확 노출하려고합니다)DB 디자인 : 계층 구조

글쎄, 난 더와 부모> 자식 관계로 자신에게 linket 수있는 몇 가지 데이터를 저장할 필요가 없습니다 - 깊은 곳에서.

내 첫 번째 시도했다 :

entry_id | parent_id | value 
    1 | NULL | Foo //foo is the grand parent 
    2 | 1  | Bar //bar is child of Foo 
    3 | 1  | Baz //baz too 
    4 | 2  | Bho //bho is child of Bar 
    5 | 4  | Som //som is child of Bho 
    6 | NULL | Git //another grand parent 
    7 | 6  | Tim //Git's child 

.. 그리고 등등.

이 구조는 작동하지만, 불가능합니다 (또는 적어도 통과 할 수 없습니다) 단지 1 개의 쿼리만으로 모든 Foo 하위 및 '하위 하위'를 찾으십시오. 이것은 루프가 필요합니다.

내 목표는 구조가 SELECT 질의에 최적화 된 것으로, 즉 나에게 한 번에 모든 관계를 제공 할 수 있습니다, 뭔가 같은 :

SELECT "ALL SONS OF Bar" 

출력 :

entry_id | parent_id | value 
    1  | NULL | Bar 
    4  | 2  | Bho 
    5  | 4  | Som 

하지만이 구조 나던 내가 그렇게하도록 내버려 뒀다.

아이디어가 있으십니까? 중요 할 수 있다면, 내가 PostgreSQL을 실행할 수 있습니다

은 (내가 배열 필드 유형을 사용하는 것으로 생각하지만, 쿼리는 늘 훨씬 빨리)

필립 주석에 대한 편집 : 내 특정의 데이터 야해 너무 자주 변경되지만 데이터를 여러 번 업데이트 할 수있는 동일한 작업 - 다른 작업에도이 구조를 사용해야 할 것입니다.

+0

얼마나 자주 데이터가 변경되며 변경 될 것입니다 (분기 추가, 분기 노드 교체, 고아와의 거래 등). 간단한 시스템은 바로 가기를 허용 할 수 있지만 심각한 유연성이 필요한 경우 상황이 까다로워 질 수 있습니다. –

+1

값 0이 잘못되었으므로이 값과 함께 entry_id가 없습니다. 외래 키 제약 조건은 실패합니다. 부모가없는 경우 NULL을 사용하십시오. –

+0

@ 프랭크 : 너 맞아. – Strae

답변

10

난 당신이 독서의 혜택을 것이라고 생각 - 최고 (더 고아가 허용되지 않습니다 모든 차일을 삭제해야 삭제 한 '아버지')입니다 외래 키 (또는 비슷한 동작)를 사용하여 보조 노트로

, Managing Hierarchical Data in MySQL. 플랫 테이블을 몇 가지 속성과 일부 하우스 키를 사용하여 계층 구조로 변환하는 방법을 알려줍니다. 그런 식으로하지 않더라도 통찰력이 있습니다.

PostgreSQL의 경우 WITH RECURSIVE 쿼리로 수행 할 수 있습니다 (WITH Queries (Common Table Expressions)).
사용하려면 버전 8.4 이상이 필요합니다. JMZ 이미 말했듯이

http://www.slideshare.net/billkarwin/models-for-hierarchical-data

그리고, 재귀 쿼리가 진짜 문제 해결사 있습니다

+1

+1 WITH RECURSIVE 기능. – rfusca

4

빌 Karwin은 계층 적 데이터에 대한 멋진 슬라이드 쇼를했다.

+1

슬라이드 쇼를 보는 경우 중첩 세트 모델에 특히주의하십시오. 또한 인접 목록이 귀하의 디자인임을 유의하십시오. –