데이터베이스에 디렉토리 / 계층 구조 / 트리 구조를 저장하는 방법은 무엇입니까?
데이터베이스에 디렉토리 / 계층 구조 / 트리 구조를 어떻게 저장합니까? 즉 MSSQL 서버입니다.
@olavk : 내 대답을 본 것 같지 않습니다. 내가 사용하는 방식은 재귀 쿼리보다 훨씬 낫습니다. :)
pps 이것이 갈 길이다!
SQL 데이터베이스에 계층을 저장 하는 방법 에는 여러 가지 가 있습니다. 선택하는 것은 사용하는 DBMS 제품 및 데이터 사용 방법에 따라 다릅니다. MSSQL2005 태그를 사용 했으므로 "인접 목록"모델을 고려해야한다고 생각합니다. 응용 프로그램에서 제대로 작동하지 않는 경우 여러 성능 특성에 중점을 둔 모델 간의 차이점을 강조하는 Vadim Tropashko의 비교 를 살펴보십시오 .
Sql Server 2008을 사용하는 것이 옵션 인 경우 새 hierarchyid 데이터 형식을 확인해야 할 수 있습니다 .
또한 ParentID 모델에 비해 몇 가지 장점이있는 Nested-Set 트리 모델이 있습니다. 참조 http://www.evanpetersen.com/item/nested-sets.html 및 http://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")가있는 테이블입니다.
'Program Tip' 카테고리의 다른 글
Android NDK 및 STLport에서 boost 라이브러리 (shared_ptr 포함)를 사용하는 방법 (0) | 2020.12.27 |
---|---|
요청 받기가 액세스 제어 검사를 통과하지 못함 : 요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. (0) | 2020.12.27 |
오른쪽 하단 div 주위에 텍스트를 줄 바꿈하려면 어떻게해야합니까? (0) | 2020.12.27 |
"데스크탑 Safari"와의 알려진 "iPad의 Safari"차이점 목록 (0) | 2020.12.27 |
symfony2- "dev"에서 "prod"로 전환하는 방법은 무엇입니까? (0) | 2020.12.27 |