2009-06-01 4 views
125

데이터베이스에 트리 데이터 구조를 사용자 정의 (즉, 알 수없는 수준의 트리 구조)하는 가장 좋은 방법은 무엇입니까?트리 데이터 구조에 대한 데이터베이스 구조

외래 키가있는 테이블을 사용하기 전에이 작업을 한 번 수행했습니다.

다른 구현을 볼 수 있으며이 구현이 의미가 있습니까?

+3

참조 : [관계형 데이터베이스에 계층 적 데이터를 저장하기위한 옵션은 무엇입니까?] (http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in -a-relational-database) – cbare

+0

SQL Server는 2008 년부터 [hierarchyid 데이터 형식] (https://msdn.microsoft.com/en-us/library/bb677290.aspx)을 제공합니다. – BornToCode

답변

63

당신은 인접성 (adjacency) 목록이다, 가장 일반적으로 구현을 언급 : https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

다른 모델이 구체화 경로와 중첩 된 세트를 포함,뿐만 아니라 있습니다 http://communities.bmc.com/communities/docs/DOC-9902

조 셀코이에 책을 썼다 주제는 일반적인 SQL 관점에서 좋은 참조입니다 (위의 중첩 된 세트 기사 링크에서 언급 됨).

또한 Itzik Ben-Gann은 자신의 저서 "Inside Microsoft SQL Server 2005 : T-SQL 쿼리"에서 가장 일반적인 옵션에 대한 개요를 잘 알고 있습니다. 모델을 선택할 때 고려해야 할

주요 사항은 다음과 같습니다 구조 변화의

1) 주파수 - 트리 변화의 실제 구조를 수행하는 빈도. 일부 모델은 더 나은 구조 업데이트 특성을 제공합니다. 그러나 구조 변경을 다른 데이터 변경과 분리하는 것이 중요합니다. 예를 들어 회사의 조직도를 모델링 할 수 있습니다. 어떤 사람들은 직원 ID를 사용하여 직원을 감독자와 연결시키는 인접 목록으로 모델링합니다. 이것은 대개 차선책입니다. 더 잘 작동하는 접근 방식은 직원 자체와는 별도로 조직 구조를 모델링하고 직원을 구조의 특성으로 유지하는 것입니다. 이렇게하면 직원이 회사를 떠날 때 조직 구조 자체가 변경 될 필요가 없으며 직원과의 관계가 유지됩니다.

2) 트리가 쓰기가 무겁거나 읽기가 무겁습니까 - 일부 구조는 구조를 읽을 때 매우 잘 작동하지만 구조에 쓰는 경우 추가 오버 헤드가 발생합니다.

3) 구조에서 얻을 수있는 정보 유형 - 일부 구조는 구조에 대한 특정 종류의 정보를 제공하는 데 탁월합니다. 예를 들어, 노드 및 모든 자식 찾기, 노드 및 모든 부모 찾기, 특정 조건을 만족하는 자식 노드 수 찾기 등이 있습니다.필요에 가장 적합한 구조를 결정하기 위해 구조에서 필요한 정보를 알아야합니다.

+0

안녕하세요.이 질문과 똑같은 문제에 직면하고 있으며 위의 주제에 대해 질문하고 싶습니다. 같은 테이블에서 ParentId를 참조하는 조직 구조 테이블 (직원 구조화 테이블이 아님)과 같은 구조를 고려할 때 특정 영역의 보스가 누구인지 설정해야합니다. 나는 그 특정 지역의 모든 직원들을 그것에 직접적으로 배정 할 것이다. 그 특정 지역의 보스를 어디에서 두셨습니까? 위의 같은 지역 또는 하나의 gorup 안에? 내 접근 방식은 위의 그룹으로 그를 언급하는 것이고, 그것은 내가 생각하는 더 나은 구조를 제공한다. 감사. –

+1

첫 번째 링크가 손상된 것 같습니다. –

+0

@J. C. Leitão - 감사합니다. 링크를 업데이트했습니다. – JeremyDWill

48

Managing Hierarchical Data in MySQL을 살펴보십시오. 관계형 데이터베이스에서 계층 형 (트리 형) 데이터를 저장하고 관리하기위한 두 가지 접근법에 대해 설명합니다.

첫 번째 접근법은 인접성 목록 모델입니다.이 기본 모델은 본질적으로 설명합니다 : 테이블 자체를 참조하는 외래 키가 있어야합니다. 이 방법은 간단하지만 전체 트리를 만드는 것과 같은 특정 쿼리에서는 매우 비효율적 일 수 있습니다.

이 기사에서 논의 된 두 번째 방법은 중첩 세트 모델입니다. 이 방법은 훨씬 효율적이고 유연합니다. 자세한 설명과 예제 쿼리는이 기사를 참조하십시오.

+0

링크가 매우 흥미로운 주제가 있습니다 논의되고있다. 감사! – Fritz

2

외래 키가있는 테이블을 가지고있는 것이 나에게 의미가 있습니다.

그런 다음 SQL에서 공통 테이블 표현식을 사용하거나 Oracle에서 이전 명령문으로 연결하여 트리를 빌드 할 수 있습니다.

+0

LogID ID 열이있는 로그 테이블과 LogID 열을 가리키는 FK가있는 ParentLogID 열이 있습니다. 트랜잭션의 첫 번째 로그 행이 작성되면 SCOPE_IDENTITY()를 사용합니다. 다른 모든 로그 레코드는 ParentLogID 열에이 값으로 기록됩니다. 이것은 함께 속하는 행을 그룹화하는 데 정말 유용합니다. 어떤 일이 일어 났는지를 확인하는 유일한 방법은 이것 없이는 여러 트랜잭션의 로그 행이 서로 혼재하는 것입니다. –

+0

@KM - 그는 "이해가되지 않는다"고 말하지 않았습니다. "이해가되지 않습니다." –

1

나는 삶 간단하게하기 위해 인접리스트 모델에 사용할 수있는 함수를 사용하는 SQL Server의 준비의 2005 확인 here

8

당신은 PostgreSQL을 계층 적 트리 구조에 저장된 데이터의 레이블을 나타내는 데이터 유형을 제공하는 멋진 ltree의 모듈이 다음 트리 데이터 구조를 구성하는 관계형 데이터베이스를 사용하는 경우. 거기에서 아이디어를 얻을 수 있습니다 (자세한 내용은 http://www.postgresql.org/docs/9.0/static/ltree.html 참조)

일반적으로 LDAP는 계층 구조로 레코드를 구성하는 데 사용됩니다.

관련 문제