web-dev-qa-db-ja.com

MySQL階層データの隣接リストモデルとネストセットモデル?

MySQLで階層データを処理する2つの方法

  1. 隣接リストモデル
  2. ネストされたセットモデル

隣接リストモデルの主な問題は、階層のパスを取得するためにノードごとに1つのクエリを実行する必要があることです。

ネストされたセットモデルではこの問題は存在しませんが、追加されたノードごとに、他のすべてにMySQL UPDATEを与える必要がありますleftおよびright値。

私の階層データは、eコマースの製品カテゴリなどの静的データではありません。階層的な順序でユーザーを常に登録しています。

私のアプリケーションでは、多くの定数ユーザー登録がありますが、階層の最初のノードに到達するまで階層パスも取得する必要があります。

私の状況を分析すると、2つの選択肢のうちどちらが私のアプリケーションに最適でしょうか?

21
Gustavo Piucco

ネストされたセットモデルは、1つではなく2つの「ポインター」を管理する必要があるという事実を考慮すると、現在、データベースでは一般的に使用されていません。実際、ネストされたセットモデルは、階層をたどる再帰的なクエリを実行することが複雑または不可能だったときに、データベースに導入されました。

1999年以降、標準SQLには、いわゆる再帰的共通テーブル式、または再帰的CTEが含まれています。これにより、anyレベル数。

特に例外的なMySQLを除いて、すべての主要なDBMSシステムにこの機能が含まれています。しかし、MySQLでは、ストアドプロシージャを使用してこの問題を克服できます。たとえば、 StackOverflowのこの投稿 、または dba.stackexchangeのこの投稿 を参照してください。

要約すると、これらは私のアドバイスです:

  1. それでもDBMSの使用を決定できる場合は、いくつかの代替案を強く検討してください。たとえば、オープンソースデータベースを使いたい場合は、 PostgreSQL を使用し、Adiacency List Modelを使用して、再帰CTEを使用します。あなたのクエリ。
  2. DBMSを変更できない場合でも、Adiacency List Modelを使用し、リファレンスに記載されているストアドプロシージャを使用する必要があります。

[〜#〜]更新[〜#〜]

この状況はMySQL 8で変化しており、現在開発中です Recursive CTEを統合します 。そのバージョンから、Adiacency List Modelはより簡単に使用できるようになります。

29
Renzo