ツリーを頻繁に更新する必要がある場合、入れ子集合の設計は間違いなく困難です。ツリーの大部分の番号を付け直す必要があります。
これを軽減するための1つの提案は、整数の代わりに浮動小数点数を使用することです。ツリーに新しいノードを挿入すると、新しいノードの親のネストされたセット番号の間にいくつかのFLOAT番号を見つけるのは比較的簡単です。最終的には浮動小数点数の精度の限界に達する可能性がありますが、ツリーはそれほど深くないため、長い間発生することはありません。
私が書いたもう1つのテクニックは、クロージャーテーブルと呼ばれます。 。階層を格納するこの方法により、ツリーの多くを更新しなくても、大きなツリーにノードを挿入/更新/削除することがはるかに簡単になります。また、単一の非再帰SQLクエリでツリー全体または任意のサブツリーをクエリできます。
クロージャーテーブルの詳細については、以下を参照してください:
- フラットテーブルをツリーに解析するための最も効率的でエレガントな方法は何ですか?
- SQLとPHPを使用した階層データのモデル
- クロージャーテーブル階層でのサブツリーの移動
- SQLアンチパターン:データベースプログラミングの落とし穴の回避
コメントを再確認してください:
隣接リストは単純で、冗長性が最小限であり、入れ子集合ではサポートされていないFK関係をサポートします。 再帰クエリを使用する場合、隣接リストは任意の深さのツリー全体のクエリをサポートします 。ただし、MySQLは再帰クエリをサポートしていません。
直接の親子関係(つまり、1レベルの深さ)のみをクエリする必要がある場合、または固定の深さのツリーのみをクエリする必要がある場合は、隣接リストで問題ありません。