階層データモデル:ネストされたセットの対隣接リスト
-
06-09-2019 - |
質問
私は、製品カタログを持っています。各カテゴリには、サブカテゴリの(深い)で別の番号で構成されています。 (深い)レベルの数は不明であるが、私はかなり確実それが5,6のレベルで超過されないこと。データの変更は、読み込みはるかめったにありません。
質問です:階層データモデルの種類は、このような状況に適しています。プロジェクトはDjangoフレームワークに基づいており、それが考慮されるべき特殊性(管理者I-顔、ハンドリングモデル...)ですされます。
多くの感謝!
解決
Nested sets
あなたが頻繁に更新または階層的な順序付けを必要としない場合は、パフォーマンスに優れています。
あなたは木の更新や階層秩序のいずれかが必要な場合は、それがparent-child
データモデルを使用することをお勧めします。
これは、簡単にOracle
にそう簡単に(それでも可能)SQL Server 2005+
とMySQL
に構築され、ないです。
他のヒント
私は、階層データのこの種のため、変更された予約限定ツリートラバーサルアルゴリズム、MPTTを使用します。あなたは構造の変更にペナルティを少し気にしない場合、これは、ツリーを横断し、子供たちを見つけることに優れたパフォーマンスを可能にします。
幸いにもDjangoはこのために利用可能な素晴らしいライブラリ、ジャンゴ・MPTT を持っています。私は多くの成功とプロジェクトの数でこれを使用しました。そこいくつかの代替のアルゴリズムを提供していますジャンゴ - 木の髭にもだが、私は使用していませんそれは(それはとにかくMPTTほど人気のようではありません)。
これらの記事によると:
http://explainextended.com/ 2009/9月24日/隣接リスト-VS-セット-postgresqlのネストされた/する http://explainextended.com/2009/09 / 29 /隣接リスト-VS-ネストされたセット-のMySQL / の
「MySQLは、ネストされたセットモデルがまともなパフォーマンスを示し、保存された階層データに考えることができるため、大きな4(MySQLやOracleやSQL Serverの、PostgreSQLの)の唯一のシステムです。」
隣接リストを維持する方がはるかに簡単ですし、ネストされたセットが照会する多くの高速化されます。
問題が常にネストされたセットに隣接リストを変換するRBARでロードは本当に厄介な「プッシュ・スタック」方式への長いおかげへの道をとっているということでした。だから、人々がそれらを使用してネストされたセットの中にいくつかの本当に難しいメンテナンスをやって終わるかどうか。
さて、あなたはあなたのケーキを持つことができ、あまりにも、それを食べます!あなたは4秒以下nodesinと分未満で万行10万で変換を行うことができます!道によるT-SQLのすべて、!以下の記事を参照してください。
ステロイド#1の階層:の設定した入れ子に隣接リストを変換しますP>
#2:ネストされたセットの計算の<の交換/ P>