관계형 데이터베이스를 사용하는 것이 실행 가능한 솔루션입니다.사용자의 요구를 들어 - 빠른 삽입, 업데이트, 삭제 - 나는 등의 추가 사용자 지정과 인접성 목록을 사용하십시오 :
id
parent_id
cardinality -- sort order for all nodes with the same parent_id
depth -- distance from the root node
는 cardinality
을 계산하고 depth
은 하나의 코드로 수행 또는 - 바람직 - 데이타베이스 트리거를 어떤을 위해 삽입, 삭제 또는 업데이트 할 수 있습니다. 또한, 하나의 SELECT 문 전체 계층을 입수하는 계층 브리지 테이블이 요구된다
id
descendent_id
이 테이블은 상기 한 바와 같은 트리거로 채워 상기 모든 노드를 검색하기위한 수단으로서 제공 될
또는 아래에 주어진 id
.
See this question for additional detail around Adjacency List, Hierarchy Bridge and other approaches for storing hierarchical data in a relational database.
마지막으로 당신이 나열된 옵션에 대한 몇 가지 추가 설명을 제공합니다 :
업데이트하면,이 답변의 모든 조각을 구현하는 추가
경우가 저렴, 다시 종류의 작은 비용, 이동 비싸다. 트레이드 오프는 빠른 계층 트래버스 읽기입니다. 예를 들어 한 번의 작업으로 노드의 완전한 조상을 찾을 수 있습니다. 특히 리프 추가는 O (1) 연산입니다. 재 정렬은 이동 된 노드 다음에 오는 모든 피어 노드의 카디널리티를 업데이트하는 것을 의미합니다. 이동이란 (2) 이동 및 자손 노드 깊이, (3) 계층 구조 브리지 테이블에 조상을 제거하고 추가하는 것, (2) 이동하는 소스 및 대상 피어 노드에 대한 (1) 카디널리티의 업데이트를 의미합니다.
그러나 독점권 목록만으로는 (즉, id, parent_id
) 쓰기가 저렴 해지고 한 단계의 읽기는 저렴하지만 계층 구조를 통과하는 읽기는 비용이 많이 듭니다. 후자의 경우 SQL Server 및 기타 RDBMS에서 볼 수있는 것처럼 Oracle의 CONNECT BY 또는 Common Table Expressions와 같은 재귀 SQL을 사용해야합니다.
트리 및 정렬 된 목록을 나타내는 이러한 SQL 메서드는 얼마나 효율적입니까? 나는 항상 SQL이 세트/정렬되지 않은 것이 더 좋다고 생각했다. 그러나이 SQL 계층 구조 표현을 살펴 보겠습니다. JCR은 흥미로 보였습니다 만, 상당히 무겁습니다. – windoze
@windoze : 내 업데이트 참조. – orangepips