문제

제품 카탈로그가 있습니다.각 카테고리는 서로 다른 수(깊이)의 하위 카테고리로 구성됩니다.레벨 수(깊이)는 알 수 없지만 5,6 레벨을 초과하지 않을 것이라고 확신합니다.데이터 변경은 읽는 것보다 훨씬 더 드뭅니다.

질문은 ~이야:이러한 상황에는 어떤 유형의 계층적 데이터 모델이 더 적합합니까?이 프로젝트는 Django 프레임워크를 기반으로 하며 그 특성(관리자 i-face, 모델 처리...)을 고려해야 합니다.

정말 감사합니다!

도움이 되었습니까?

해결책

Nested sets 자주 업데이트 또는 계층 적 순서가 필요하지 않은 경우 성능에 더 좋습니다.

트리 업데이트 또는 계층 적 순서가 필요한 경우 사용하는 것이 좋습니다. parent-child 데이터 모델.

쉽게 구성됩니다 Oracle 그리고 SQL Server 2005+, 그리고 쉽게 (그러나 여전히 가능하지는 않지만) MySQL.

다른 팁

이러한 종류의 계층적 데이터에는 Modified Preorder Tree Traversal 알고리즘인 MPTT를 사용합니다.이는 구조 변경에 대한 약간의 페널티를 신경 쓰지 않는다면 트리를 순회하고 하위 항목을 찾는 데 뛰어난 성능을 제공합니다.

다행히 Django에는 이를 위한 훌륭한 라이브러리가 있습니다. 장고-mptt.나는 이것을 많은 프로젝트에서 사용하여 많은 성공을 거두었습니다.또한 있습니다 장고나무수염 이는 몇 가지 대체 알고리즘을 제공하지만 나는 그것을 사용하지 않았습니다(어쨌든 mptt만큼 인기가 없는 것 같습니다).

이 기사에 따르면 :

http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/ http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/

"MySQL은 중첩 된 세트 모델이 괜찮은 성능을 보여주고 계층 적 데이터를 저장하는 것으로 간주 될 수있는 Big Four (MySQL, Oracle, SQL Server, PostgreSQL)의 유일한 시스템입니다."

인접력 목록은 유지하기가 훨씬 쉽고 중첩 된 세트는 쿼리보다 훨씬 빠릅니다.

문제는 항상 인접성 목록을 중첩 세트로 변환하는 것이 RBAR로로드 된 정말 불쾌한 "푸시 스택"방법 덕분에 오랫동안 오랫동안 이루어 졌다는 것입니다. 그래서 사람들은 중첩 세트에서 정말 어려운 유지 보수를하거나 사용하지 않습니다.

이제 케이크를 먹고 먹을 수 있습니다! 4 초 미만의 100,000 노드에서 1 분 안에 백만 행으로 변환 할 수 있습니다! 그건 그렇고 T-SQL로 모두! 다음 기사를 참조하십시오.

스테로이드의 계층 #1 : 인접성 목록을 중첩 세트로 변환

스테로이드의 계층 #2 : 중첩 세트 계산 대체물

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top