7
リレーショナルデータベースに階層データを格納するためのオプションは何ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 10か月前に閉鎖。 良い概要 一般的に言って、あなたは速い読み込み時間(例えば、入れ子になったセット)または速い書き込み時間(隣接リスト)の間で決定を下しています。通常、ニーズに最も適合する以下のオプションの組み合わせになります。以下に、いくつかの詳細な資料を示します。 もう1つのネストされた間隔と隣接リストの比較:隣接リスト、マテリアライズドパス、ネストされたセット、ネストされた間隔の最も優れた比較。 階層データのモデル:トレードオフと使用例の適切な説明を含むスライド MySQLでの階層の表現:特にネストされたセットの概要 RDBMSの階層データ:私が見た中で最も包括的でよく整理されたリンクのセットですが、説明の仕方はあまりありません オプション 私が知っているものと一般的な機能: 隣接リスト: 列:ID、ParentID 実装が簡単です。 安価なノードが移動、挿入、削除されます。 レベル、祖先と子孫、パスを見つけるのに費用がかかる それらをサポートするデータベースの共通テーブル式によるN + 1を回避する ネストされたセット(別名Modified Preorder Tree Traversal) 列:左、右 安い祖先、子孫 O(n/2)揮発性エンコーディングのため、非常に高価な移動、挿入、削除 ブリッジテーブル(別名クロージャテーブル/ wトリガー) 先祖、子孫、深さ(オプション)で個別の結合テーブルを使用します 安い祖先と子孫 O(log n)挿入、更新、削除にかかるコスト(サブツリーのサイズ) 正規化されたエンコーディング:RDBMS統計と結合のクエリプランナーに適しています ノードごとに複数の行が必要 系統列(別名マテリアライズドパス、パス列挙) 列:系統(例:/ parent / child / grandchild / etc ...) 接頭辞クエリによる安い子孫(例LEFT(lineage, #) = '/enumerated/path') O(log n)挿入、更新、削除にかかるコスト(サブツリーのサイズ) …