> 데이터 베이스 > MySQL 튜토리얼 > 플랫 테이블을 중첩 트리 구조로 효율적으로 구문 분석하려면 어떻게 해야 합니까?

플랫 테이블을 중첩 트리 구조로 효율적으로 구문 분석하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2025-01-25 06:09:09
원래의
973명이 탐색했습니다.

How Can I Efficiently Parse a Flat Table into a Nested Tree Structure?

플랫 테이블을 트리 구조로 효율적으로 구문 분석

소개

트리 계층 구조를 나타내는 플랫 테이블을 다양한 방법을 사용하여 달성할 수 있는 중첩 구조로 효율적으로 변환합니다. 이 기사에서는 기본 데이터 구조를 사용하는 최소한의 접근 방식을 살펴보고 트리 표현을 최적화하기 위한 대체 데이터베이스 저장 방법을 고려합니다.

미니멀한 분석 방법

테이블에 다음 데이터가 포함되어 있다고 가정합니다.

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

이 테이블을 트리 구조로 구문 분석합니다.

  1. 사전 만들기: 각 노드의 ID를 해당 데이터에 매핑합니다.

  2. 루트 노드 식별: 루트 노드는 ParentId가 없는 노드입니다.

  3. 트리 구축: 재귀적으로 하위 노드를 생성하고 해당 상위 노드에 추가하여 트리를 구축합니다.

    • 루트가 아닌 각 노드에 대해 해당 ParentId를 사용하여 사전에서 상위 노드를 찾습니다.
    • 노드를 상위 노드의 하위로 추가합니다.
  4. 하위 노드 정렬: 하위 노드의 순서에 따라 각 노드의 하위 노드를 정렬합니다.

이 메소드에 대한 의사 코드:

<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>
로그인 후 복사

SQL의 트리 구조에 대한 대체 저장 방법

마감 테이블:

관계형 데이터베이스에 트리 구조를 저장하는 또 다른 방법은 상위 노드 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿