web-dev-qa-db-ja.com

ツリーでツリーのような構造を表現する方法

私はプロジェクトを開始しており、設計段階にあります。つまり、どのdbフレームワークを使用するかをまだ決定していません。 「森」のような構造を作成するコードを作成します。つまり、各ツリーが標準である多くのツリー:ノードとエッジ。コードがこれらのツリーを作成した後、それらをデータベースに保存します。 (そして最終的にそれらを引き出します)

データベースでデータを表現するための素朴なアプローチは、ノードとエッジの2つのテーブルを持つリレーショナルデータベースです。つまり、ノードテーブルにはノードID、ノードデータなどが含まれます。また、エッジテーブルはノードIDからノードIDへのマッピングになります。

より良いアプローチはありますか?または、私が与えている(限られた)仮定を考えると、これが最善のアプローチですか?ツリーが比較的小さいという仮定を追加した場合はどうでしょう-ツリー全体をblobとしてdbに保存する方が良いでしょうか?その場合、どのタイプのデータベースを使用すればよいですか?速度/スケーラビリティについてコメントしてください。

ありがとう

31
Guy

StackOverflowの質問に対する私の回答で、ノードとエッジテーブルに似たソリューションを示しました: フラットテーブルをツリーに解析する最も効率的でエレガントな方法は何ですか? このソリューションを「クロージャ」と呼びますテーブル"。

SQLでツリーを保存および使用するさまざまな方法についてのプレゼンテーションを行いました SQLおよびPHPを使用した階層データのモデル 。 (実行する必要のあるクエリに応じて)適切なインデックスを使用すると、エッジの大きなコレクション(デモでは約50万のエッジ)でも、クロージャテーブルのデザインが非常に優れたパフォーマンスを発揮できることを示しました。

本のデザインについても取り上げました SQLアンチパターン:データベースプログラミングの落とし穴を回避する

19
Bill Karwin

ループしないように、ツリー化するエンティティには何らかの低レベルのコーディングを使用してください。エンティティは、パーツ、サブジェクト、フォルダなどです。

EntityファイルとEntity-Xrefファイルを使用すると、2つのファイル間の2つの関係(親と子の関係)のいずれかをループできます。

レベルは、ツリー内でエンティティが見つかったレベルです。エンティティの低レベルコードは、エンティティがツリーのどこにでも見つかる最低レベルです。ループを防止するために、子にするエンティティの低レベルコードが以下であることを確認してください。エンティティを子として追加すると、エンティティは少なくとも1レベル下になります。

1
eric