2009-03-29 20 views
8

リレーショナルデータベースにコンポジットパターンを保存するためのベストプラクティスは何ですか?データベースに複合パターン(階層データ)を格納する

Modified Preorder Tree Traversalを使用しています。ツリー全体を構築するのは非常に速いですが、新しいノードを挿入または削除するには非常に時間がかかります(左右の値はすべて調整する必要があります)。また、ノードの子を照会することは容易ではなく、非常に遅いです。

私たちが気づいたもう一つのことは、本当にツリーが乱雑にならないようにする必要があるということです。トランザクションのロックが必要です。そうしないと、左と右の値が壊れてしまい、破損した左の右のツリーを修正するのは簡単ではありません。

しかし、これは変更されたPreorder Tree Traversalですが、より良い選択肢があるかどうかは疑問でした。

+0

Irは、ほとんどのクエリが使用される種類に依存します。 –

答えて

6

MPTTを使用して行のすべての子孫を見つけるのは高速ですが、すべての子を見つけるのが遅くなる可能性があります。しかし、あなたはテーブルにparent_idフィールドを追加して、行の親を記録する(冗長にする)ことによってそれを修正できるはずです。そして、検索は次のようになります。

SELECT * 
FROM tbl 
WHERE parent_id = z 

はい、parent_idは、潜在的にあなたのテーブルを非正規化、冗長な情報が含まれている - しかし、任意の挿入/更新/削除が既にグローバルな変更を必要とするため、最新のparent_idを維持することは非常に余分ではありません支払う。代わりに、levelフィールドを使用して行の垂直レベルを記録することもできますが、実際にはです。特定のタイプの変換(ツリー内の別のポイントに移動するなど)の下ではが変更される可能性があります。

(すなわち、単にparent_idなしleft_posまたはright_posを持つ)昔ながらのリンクから親への表現は、より高速な挿入/更新重いワークロードのはもちろんであるが、それは効率的に答えることができる唯一のクエリは、「親を探すいますXの "と" Xの子を見つける "。ほとんどの作業負荷は文章よりもはるかに読み込みが多いので、通常はMPTTの方が全体的に速いですが、おそらくあなたの場合は、リンクから親へ移動することを検討する必要がありますか?

0

私が聞いたデータベースに階層型データを格納する最も良い方法は、コンテンツがコロンなどで区切られた親のリストである文字列属性を使用することです。

関連する問題