隣接リストモデルの主な問題は、階層のパスを取得するためにノードごとに1つのクエリを実行する必要があることです。
ネストされたセットモデルではこの問題は存在しませんが、追加されたノードごとに、他のすべてにMySQL UPDATEを与える必要がありますleftおよびright値。
私の階層データは、eコマースの製品カテゴリなどの静的データではありません。階層的な順序でユーザーを常に登録しています。
私のアプリケーションでは、多くの定数ユーザー登録がありますが、階層の最初のノードに到達するまで階層パスも取得する必要があります。
私の状況を分析すると、2つの選択肢のうちどちらが私のアプリケーションに最適でしょうか?
ネストされたセットモデルは、1つではなく2つの「ポインター」を管理する必要があるという事実を考慮すると、現在、データベースでは一般的に使用されていません。実際、ネストされたセットモデルは、階層をたどる再帰的なクエリを実行することが複雑または不可能だったときに、データベースに導入されました。
1999年以降、標準SQLには、いわゆる再帰的共通テーブル式、または再帰的CTEが含まれています。これにより、anyレベル数。
特に例外的なMySQLを除いて、すべての主要なDBMSシステムにこの機能が含まれています。しかし、MySQLでは、ストアドプロシージャを使用してこの問題を克服できます。たとえば、 StackOverflowのこの投稿 、または dba.stackexchangeのこの投稿 を参照してください。
要約すると、これらは私のアドバイスです:
[〜#〜]更新[〜#〜]
この状況はMySQL 8で変化しており、現在開発中です Recursive CTEを統合します 。そのバージョンから、Adiacency List Modelはより簡単に使用できるようになります。