데이터베이스에 트리 데이터 구조를 사용자 정의 (즉, 알 수없는 수준의 트리 구조)하는 가장 좋은 방법은 무엇입니까?트리 데이터 구조에 대한 데이터베이스 구조
외래 키가있는 테이블을 사용하기 전에이 작업을 한 번 수행했습니다.
다른 구현을 볼 수 있으며이 구현이 의미가 있습니까?
데이터베이스에 트리 데이터 구조를 사용자 정의 (즉, 알 수없는 수준의 트리 구조)하는 가장 좋은 방법은 무엇입니까?트리 데이터 구조에 대한 데이터베이스 구조
외래 키가있는 테이블을 사용하기 전에이 작업을 한 번 수행했습니다.
다른 구현을 볼 수 있으며이 구현이 의미가 있습니까?
당신은 인접성 (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) 구조에서 얻을 수있는 정보 유형 - 일부 구조는 구조에 대한 특정 종류의 정보를 제공하는 데 탁월합니다. 예를 들어, 노드 및 모든 자식 찾기, 노드 및 모든 부모 찾기, 특정 조건을 만족하는 자식 노드 수 찾기 등이 있습니다.필요에 가장 적합한 구조를 결정하기 위해 구조에서 필요한 정보를 알아야합니다.
안녕하세요.이 질문과 똑같은 문제에 직면하고 있으며 위의 주제에 대해 질문하고 싶습니다. 같은 테이블에서 ParentId를 참조하는 조직 구조 테이블 (직원 구조화 테이블이 아님)과 같은 구조를 고려할 때 특정 영역의 보스가 누구인지 설정해야합니다. 나는 그 특정 지역의 모든 직원들을 그것에 직접적으로 배정 할 것이다. 그 특정 지역의 보스를 어디에서 두셨습니까? 위의 같은 지역 또는 하나의 gorup 안에? 내 접근 방식은 위의 그룹으로 그를 언급하는 것이고, 그것은 내가 생각하는 더 나은 구조를 제공한다. 감사. –
첫 번째 링크가 손상된 것 같습니다. –
@J. C. Leitão - 감사합니다. 링크를 업데이트했습니다. – JeremyDWill
Managing Hierarchical Data in MySQL을 살펴보십시오. 관계형 데이터베이스에서 계층 형 (트리 형) 데이터를 저장하고 관리하기위한 두 가지 접근법에 대해 설명합니다.
첫 번째 접근법은 인접성 목록 모델입니다.이 기본 모델은 본질적으로 설명합니다 : 테이블 자체를 참조하는 외래 키가 있어야합니다. 이 방법은 간단하지만 전체 트리를 만드는 것과 같은 특정 쿼리에서는 매우 비효율적 일 수 있습니다.
이 기사에서 논의 된 두 번째 방법은 중첩 세트 모델입니다. 이 방법은 훨씬 효율적이고 유연합니다. 자세한 설명과 예제 쿼리는이 기사를 참조하십시오.
링크가 매우 흥미로운 주제가 있습니다 논의되고있다. 감사! – Fritz
외래 키가있는 테이블을 가지고있는 것이 나에게 의미가 있습니다.
그런 다음 SQL에서 공통 테이블 표현식을 사용하거나 Oracle에서 이전 명령문으로 연결하여 트리를 빌드 할 수 있습니다.
LogID ID 열이있는 로그 테이블과 LogID 열을 가리키는 FK가있는 ParentLogID 열이 있습니다. 트랜잭션의 첫 번째 로그 행이 작성되면 SCOPE_IDENTITY()를 사용합니다. 다른 모든 로그 레코드는 ParentLogID 열에이 값으로 기록됩니다. 이것은 함께 속하는 행을 그룹화하는 데 정말 유용합니다. 어떤 일이 일어 났는지를 확인하는 유일한 방법은 이것 없이는 여러 트랜잭션의 로그 행이 서로 혼재하는 것입니다. –
@KM - 그는 "이해가되지 않는다"고 말하지 않았습니다. "이해가되지 않습니다." –
나는 삶 간단하게하기 위해 인접리스트 모델에 사용할 수있는 함수를 사용하는 SQL Server의 준비의 2005 확인 here
환상적인 수집을 다음과 같은 구현을 사용했습니다.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
당신은 PostgreSQL을 계층 적 트리 구조에 저장된 데이터의 레이블을 나타내는 데이터 유형을 제공하는 멋진 ltree의 모듈이 다음 트리 데이터 구조를 구성하는 관계형 데이터베이스를 사용하는 경우. 거기에서 아이디어를 얻을 수 있습니다 (자세한 내용은 http://www.postgresql.org/docs/9.0/static/ltree.html 참조)
일반적으로 LDAP는 계층 구조로 레코드를 구성하는 데 사용됩니다.
참조 : [관계형 데이터베이스에 계층 적 데이터를 저장하기위한 옵션은 무엇입니까?] (http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in -a-relational-database) – cbare
SQL Server는 2008 년부터 [hierarchyid 데이터 형식] (https://msdn.microsoft.com/en-us/library/bb677290.aspx)을 제공합니다. – BornToCode