リレーショナルデータベースで階層データに適切なアプローチを選択する
多くのアプリケーションは、階層データ構造を利用しています。 ただし、このデータをリレーショナルデータベースに効率的に保存することは、独自の課題を提示します。 この記事では、いくつかの一般的なストレージ方法を調べて、その利点と短所を概説します。
隣接リスト方法
列:id、parentid
- 利点:簡単な実装;ノードの追加、削除、および再配置に効率的です
短所:- 祖先、子孫、およびパス情報の回収は計算上高価です。多数のクエリを持つパフォーマンスボトルネックの可能性(特に一般的なテーブル式がないデータベースで)。
ネストされたセット(変更された予約注文ツリートラバーサル)
列:左、右
利点:
祖先と子孫の効率的な検索
-
短所:動的エンコードスキームにより、ノードの挿入、削除、および移動ノードは非常に高価な操作です。
- ブリッジテーブル(トリガー付き閉鎖テーブル)
列:Ancestorid、descendantid、深さ(オプション)
利点:
効率的な祖先と子孫の検索。正規化されたエンコードは、クエリの最適化を改善します
短所:- ノードごとに複数の行が必要です。操作を挿入、更新、および削除する対数時間の複雑さがあります。
系統列(具体化されたパス、パス列挙)
- 列:系統(例えば、)
利点:
プレフィックスクエリを使用した効率的な子孫検索。
/parent/child/grandchild/etc...
短所:
操作の挿入、更新、および削除操作には、対数時間の複雑さがあります。配列データ型またはシリアル化された文字列に依存している非関係アプローチ。
-
ネストされた間隔方法
ネストされたセットに似ていますが、整数の代わりに浮動小数点数を使用して、エンコーディングのボラティリティを低下させます。
-
利点:
標準のネストされたセットと比較して、より効率的な挿入、削除、および移動操作。
フラットテーブルアプローチ
追加の
列と
安価な反復とページネーション。
短所:Level
高価な移動および削除操作
Rank
複数の系統列法
以上がリレーショナルデータベースに階層データを最適に保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。