8

以前のルートノードを指すparent_idを使用して、これをテーブルに組み込んだツリー階層を表示します。

すべてのルート ノード (root1、root2) を繰り返し処理し、root1 と child1 に対して root1 または root1/child1 へのパスを設定しています。child1 のパスを見つけるには、少なくとも 2 回呼び出してパスを作成する必要があります。5 ~ 7 レベルの深さでネストされた非常に多数のルート ノードと子を処理するため、パスを埋める効率的な方法はありますか。

create table foo (id, name, parent_id, path)
insert into foo (1, "root1', null, null)
insert into foo (2, "child1', 1, null)

root1 (path = null)
  child1 (path = root1)
    subchild1 (path = root1/child1)

root2
   child2
     subchild2
4

5 に答える 5

1

Modified Preorder Tree Traversal がとても気に入っています。単一のクエリでツリー階層全体を取得できます。詳細なチュートリアルは次のとおりです: http://www.sitepoint.com/hierarchical-data-database-2/

MPTT についてご不明な点がございましたら、お気軽にお問い合わせください。喜んでお手伝いさせていただきます。

于 2013-04-08T12:41:16.143 に答える
0

ネストされたセット モデル http://en.wikipedia.org/wiki/Nested_set_modelを使用する必要があります

于 2013-04-09T11:59:19.723 に答える
0

各ツリーのルートからリーフまでのすべてのパスを含むクロージャ テーブルを追加することを検討できます。SQL におけるグラフの推移閉包の維持(1999 年以降) では、理論的背景の一部について説明しています。

階層データに関するスタックオーバーフローのレビューの質問では、いくつかの代替アプローチについて説明しています。その中で、手霧根梨は、RDBMS の階層データを含む包括的な参考文献を指摘しています。

クロージャー テーブルには、クエリが効率的であり、ソリューションが現在のデータ構造に影響を与えないという利点があります。クロージャ テーブルを使用して拡張し、フォレストが変更されたときに維持する必要があります。

テーブル内の多数のアイテムを短いパスで示しています。これにより、クロージャ テーブルのパフォーマンスは、適切なインデックスでほぼ線形のままになります。また、再計算を避けるために、クローズ テーブル内の各ノードへのパスを保持することもできます。このアプローチでは、操作ごとに一定数のクエリがあり、任意の深さの階層がサポートされます。

于 2013-04-07T18:08:11.417 に答える