53

데이터베이스에 디렉토리/계층 구조/트리 구조를 저장하려면 어떻게해야합니까? 즉 MSSQL 서버.데이터베이스에 디렉토리/계층 구조/트리 구조를 저장하는 방법은 무엇입니까?

@olavk : 내 대답을 본 것처럼 보이지 않습니다. 내가 사용하는 방식은 재귀 쿼리보다 훨씬 낫다. :)

p.p.s. This is가는 길!

+0

당신이 옹호하는 것은 "구체화 된 경로"인코딩 모델입니다. 이 방법은 이해하기 쉽지만 일부 작업에서는 비효율적입니다. http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ –

+2

좋은 질문 ... – anbanm

답변

17

SQL 데이터베이스에 계층 구조를 저장하는 데는 many ways이 있습니다. 선택해야하는 것은 사용하는 DBMS 제품과 데이터 사용 방법에 따라 다릅니다. MSSQL2005 태그를 사용 했으므로 "인접 목록"모델을 고려해야한다고 생각합니다. 귀하의 응용 프로그램에 적합하지 않은 것으로 판명 된 경우 Vadim Tropashko's comparison을보고 여러 성능 특성에 초점을 맞춘 모델 간의 차이점을 강조하십시오.

4

이 질문에 대한 북마크에 불과하지만 도움이 될 수도 있습니다. 나는 this article's 접근법을 사용하여 데이터베이스에 디렉토리/트리 구조를 저장했다.

아티클에도 유용한 코드 스 니펫이 있습니다.

희망이 도움이됩니다.

나는

3

는 SQL Server 2005를 사용하고 어떤 식 으로든 해당 웹 사이트와 제휴 아니에요? Recursive queries은 계층 적 데이터를 훨씬 더 우아하게 쿼리합니다.

편집 : 구체화 된 경로는 약간의 해킹이라고 생각합니다. 경로에는 정규화되지 않은 중복 데이터가 포함되어 있으므로 트리거 등을 사용하여 업데이트 상태를 유지해야합니다. 예 : 노드가 부모를 변경하면 전체 하위 트리의 경로가 업데이트되어야합니다. 그리고 서브 트리 쿼리는 우아하고 빠른 조인이 아닌 약간의 부분 문자열 매칭을 사용해야합니다.

+0

이런 종류의 솔루션을 구현할 때 큰 장단점이 있습니다. 필자가 선호했던 재귀 적 접근법은 우아하지만 효율성이 떨어지며 경로는 더 자주 계산되어야하기 때문입니다. – izilotti

1

일반적인 방법은 외래 키 (예 : 'ParentId')가있는 테이블입니다.

4

ParentID 모델보다 몇 가지 장점이있는 Nested-Set Model of Trees도 있습니다. http://www.evanpetersen.com/item/nested-sets.htmlhttp://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html

+0

@Ali - 링크가 끊어졌습니다! – NightOwl888

+0

@ NightOwl888 예, 부러졌습니다. 방금 20 분 동안 인터넷을 검색하고 찾지 못했습니다 ... 그래서 링크가 끊어진 상태로 댓글을 삭제했습니다. – Ali

+2

몇 가지 작동 링크 –

8

SQL Server 2008을 사용하는 경우 옵션 : 아마도 새로운 hierarchyid 데이터 형식을 확인해야합니다.

+0

+1로 답변을 업데이트했습니다. 나는 그것을 막 언급하려고했다! –

2

나는 내 프로젝트 중 하나에서 비슷한 문제에 직면했다. 우리는 영원히 계속 증가 할 거대한 계층을 가졌습니다. 몇 가지 복잡한 유효성 검사를 마친 후 빠르게 트래버스하고 올바른 그룹을 찾아야했습니다. SQL Server를 사용하고 머리를 긁적이기보다는 재귀 쿼리가 유일하게 실행 가능한 솔루션이라는 것을 알고있을 때 어떻게 효율적으로 수행 할 수 있습니까? 그러나 재귀 쿼리에서 가능한 모든 최적화가 있는지 정말로 알고 있습니까? 미래에 계층 구조가 증가하지 않을 것이라는 보장이 있습니까? 그리고 재귀 쿼리가 프로덕션 환경에서 사용하기에는 너무 느리다는 것을 알았습니까?

그래서 저는 Neo4J에 기회를 주기로 결정했습니다. 그것은 많은 유용한 알고리즘이 내장 된 그래프 데이터베이스로,보기 흉하지 않은 문서와 예제를 통해 놀랍도록 빠른 순회가 이루어집니다. Neo4J에 계층 구조를 저장하고 Thrift Service (또는 다른 것)를 사용하여 계층 구조에 액세스합니다. 네, SQL 쿼리를 Neo4J와 통합하는 코드를 작성해야하지만 확장 가능하고 미래 보장적인 솔루션을 갖게 될 것입니다.

희망이 있으면 유용 할 것입니다.

2

질문은 닫힌 this question과 비슷합니다. 내가 추구에 매우 도움이 두 질문에 대한 답을 발견, 그들은 결국 트리 구조 모델링하는 5 개 가지 방법을 제시 MongoDB의 설명서를 알려준 : 이 https://docs.mongodb.com/manual/applications/data-models-tree-structures/

MongoDB를 관계형 데이터베이스는 아니지만, 제시된 모델을 적용 할 수 있습니다를 관계형 데이터베이스뿐만 아니라 JSON과 같은 다른 형식으로도 변환 할 수 있습니다. 제시된 찬성/반대 의견을 토대로 어떤 모델이 옳은 것인지 분명히 알아야합니다.

이 질문의 작성자는 상위 경로와 구체화 된 경로 모델을 결합한 solution을 발견했습니다. 깊이와 부모를 유지하는 것은 약간의 문제 (여분의 논리, 성능)를 나타낼 수 있지만, 분명히 특정 요구 사항에 대한 단점이 있습니다. 내 프로젝트의 경우 구체화 된 경로가 가장 잘 작동하고 this 기술의 일부 문제 (정렬 및 경로 길이)를 극복했습니다.

관련 문제