Program Tip

데이터베이스에 디렉토리 / 계층 구조 / 트리 구조를 저장하는 방법은 무엇입니까?

programtip 2020. 12. 27. 19:56
반응형

데이터베이스에 디렉토리 / 계층 구조 / 트리 구조를 저장하는 방법은 무엇입니까?


데이터베이스에 디렉토리 / 계층 구조 / 트리 구조를 어떻게 저장합니까? 즉 MSSQL 서버입니다.

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

pps 이것이 갈 길이다!


SQL 데이터베이스에 계층을 저장 하는 방법 에는 여러 가지 가 있습니다. 선택하는 것은 사용하는 DBMS 제품 및 데이터 사용 방법에 따라 다릅니다. MSSQL2005 태그를 사용 했으므로 "인접 목록"모델을 고려해야한다고 생각합니다. 응용 프로그램에서 제대로 작동하지 않는 경우 여러 성능 특성에 중점을 둔 모델 간의 차이점을 강조하는 Vadim Tropashko의 비교살펴보십시오 .


Sql Server 2008을 사용하는 것이 옵션 인 경우 새 hierarchyid 데이터 형식을 확인해야 할 수 있습니다 .


또한 ParentID 모델에 비해 몇 가지 장점이있는 Nested-Set 트리 모델이 있습니다. 참조 http://www.evanpetersen.com/item/nested-sets.htmlhttp://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html


이것은 질문 이라기보다는 북마크에 가깝지만 도움이 될 수 있습니다. 내가 사용했습니다 이 문서의 데이터베이스에 디렉토리 / 트리 구조를 저장하는 방법을.

기사에는 몇 가지 유용한 코드 스 니펫도 있습니다.

도움이 되었기를 바랍니다.

나는 어떤 식 으로든 해당 웹 사이트와 관련이 없습니다.


SQL Server 2005를 사용하고 있습니까? 재귀 쿼리 는 계층 적 데이터 쿼리를 훨씬 더 우아하게 만듭니다.

편집 : 구체화 된 경로는 약간의 해킹이라고 생각합니다. 경로에는 정규화되지 않은 중복 데이터가 포함되어 있으며 업데이트 상태를 유지하려면 트리거 또는 무언가를 사용해야합니다. 예 : 노드가 부모를 변경하면 전체 하위 트리의 경로가 업데이트되어야합니다. 그리고 하위 트리 쿼리는 우아하고 빠른 조인보다는 추악한 하위 문자열 일치를 사용해야합니다.


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

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

이 정보가 유용하기를 바랍니다.


이 질문은 닫힌 이 질문 과 유사합니다 . 두 질문에 대한 답이 내 작업에 매우 도움이되었고, 결국에는 트리 구조를 모델링하는 5 가지 방법을 제시하는 MongoDB 매뉴얼로 안내했습니다 : https://docs.mongodb.com/manual/applications/data-models-tree -구조 /

MongoDB는 관계형 데이터베이스가 아니지만 제시된 모델은 관계형 데이터베이스뿐만 아니라 JSON과 같은 다른 형식에도 적용 할 수 있습니다. 제시된 장단점을 바탕으로 어떤 모델이 적합한 지 명확하게 파악해야합니다.

이 질문의 작성자는 Parent 모델과 Materialized Paths 모델을 모두 결합한 솔루션찾았습니다 . 깊이와 부모를 유지하면 몇 가지 문제 (추가 논리, 성능)가 발생할 수 있지만 특정 요구에 대한 분명한 장점이 있습니다. 내 프로젝트의 경우 Materialized Paths가 가장 잘 작동 하고이 기사의 기술을 통해 몇 가지 문제 (정렬 및 경로 길이)를 극복했습니다 .


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

참조 URL : https://stackoverflow.com/questions/144344/how-to-store-directory-hierarchy-tree-structure-in-the-database

반응형