트리 계층 구조를 나타내는 플랫 테이블을 다양한 방법을 사용하여 달성할 수 있는 중첩 구조로 효율적으로 변환합니다. 이 기사에서는 기본 데이터 구조를 사용하는 최소한의 접근 방식을 살펴보고 트리 표현을 최적화하기 위한 대체 데이터베이스 저장 방법을 고려합니다.
테이블에 다음 데이터가 포함되어 있다고 가정합니다.
Id | Name | ParentId | Order |
---|---|---|---|
1 | 'Node 1' | 0 | 10 |
2 | 'Node 1.1' | 1 | 10 |
3 | 'Node 2' | 0 | 20 |
4 | 'Node 1.1.1' | 2 | 10 |
5 | 'Node 2.1' | 3 | 10 |
6 | 'Node 1.2' | 1 | 20 |
이 테이블을 트리 구조로 구문 분석합니다.
사전 만들기: 각 노드의 ID를 해당 데이터에 매핑합니다.
루트 노드 식별: 루트 노드는 ParentId가 없는 노드입니다.
트리 구축: 재귀적으로 하위 노드를 생성하고 해당 상위 노드에 추가하여 트리를 구축합니다.
하위 노드 정렬: 하위 노드의 순서에 따라 각 노드의 하위 노드를 정렬합니다.
이 메소드에 대한 의사 코드:
<code>创建字典(table) def 获取根节点(): 根节点 = [] 对于 id, 节点 in 字典.items(): 如果 节点['ParentId'] == 0: 根节点.append(节点) 返回 根节点 def 构建树(根节点): 对于 根节点 in 根节点: 子节点 = [] 对于 id, 节点 in 字典.items(): 如果 节点['ParentId'] == 根节点['Id']: 子节点.append(节点) 子节点.sort(key=lambda x: x['Order']) 根节点['children'] = 子节点 构建树(子节点) def 打印树(根节点): 对于 根节点 in 根节点: 打印(根节点['Name']) 如果 'children' in 根节点: 打印树(根节点['children'])</code>
마감 테이블:
관계형 데이터베이스에 트리 구조를 저장하는 또 다른 방법은 상위 노드 ID와 하위 노드 ID 열을 포함하는 별도의 테이블이 포함된 클로저 테이블을 사용하는 것입니다. 이를 통해 관계를 쉽게 쿼리할 수 있습니다.
클로저 테이블을 사용한 쿼리:
<code>SELECT f.name, GROUP_CONCAT(b.ancestor_id order by b.path_length desc) AS breadcrumbs FROM FlatTable f JOIN ClosureTable a ON (f.id = a.descendant_id) JOIN ClosureTable b ON (b.descendant_id = a.descendant_id) WHERE a.ancestor_id = 1 GROUP BY a.descendant_id ORDER BY f.name</code>
중첩 세트:
중첩 세트에는 트리에 있는 각 노드의 위치 정보를 단일 테이블에 저장하는 작업이 포함됩니다. 이 방법을 사용하면 지정된 수준 또는 하위 트리 내의 노드에 대한 효율적인 범위 기반 쿼리가 가능합니다.
제공된 예제에서는 플랫 테이블을 입력으로 사용하지만 제안된 방법은 다양한 데이터 구조 및 저장 방법에서 잘 작동합니다. 적절한 기술을 사용하면 트리 계층을 효율적으로 구문 분석하고 데이터 무결성과 액세스 용이성을 보장할 수 있습니다.
위 내용은 플랫 테이블을 중첩 트리 구조로 효율적으로 구문 분석하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!