1

これが、クロージャーテーブルメソッドをテストして作成したテーブルです。

|    id    |    parentId    |    childId    |    hops
|          |                |               |
|    270   |       6        |       6       |      0
|    271   |       7        |       7       |      0
|    272   |       8        |       8       |      0
|    273   |       9        |       9       |      0
|    276   |       10       |       10      |      0
|    281   |       9        |       10      |      1
|    282   |       7        |       9       |      1
|    283   |       7        |       10      |      2
|    285   |       7        |       8       |      1
|    286   |       6        |       7       |      1
|    287   |       6        |       9       |      2
|    288   |       6        |       10      |      3
|    289   |       6        |       8       |      2
|    293   |       6        |       9       |      1
|    294   |       6        |       10      |      2

PHPを使用してこの単純なツリーを作成しようとしています。テーブルを作成するのに十分なデータがないようです。たとえば、純粋にparentId = 6を見ると、次のようになります。

-Part 6 
 -Part 7
  - ?
   - ?
 -Part 9 
   - ?
    - ?

パート8とパート10はパート7または9の下に存在することはわかっていますが、どちらも存在しません。パート10は3ノードと4ノードの両方の深さに存在することがわかっていますが、どこにありますか?

表内の他のデータを見ると、次のようになっているはずです。

- Part 6 
 - Part 7
  - Part 9
   - Part 10
 - Part 9
  - Part 10

クロージャテーブルの利点の1つは、再帰クエリの必要がないことだと思いましたか?私が間違っていることを説明するのを手伝ってもらえますか?

編集:明確にするために、これはマッピングテーブルです。「parts」と呼ばれる別のテーブルがあり、「closure」テーブルのparentId列とchildId列の両方に相関するpart_idという列があります。上記の表の「id」列(閉鎖)は、主キーを維持するためだけのものです。本当に必要ではありません。このクロージャテーブルを作成するために使用した方法については、次の記事で説明しています。http: //dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html

EDIT2:2つと3つのホップを持つことができます。アイテムに名前を付けることで簡単に説明します。

Part 6 = Bicycle
Part 7 = Gears
Part 8 = Chain
Part 9 = Bolt
Part 10 = Nut

ナットはボルトの一部です。ボルトとナットのコンボは、自転車内と自転車の一部であるギア内に直接存在します。

使用する方法に関連して、隣接、エッジ、列挙型パス、クロージャー、DAGS(ネットワーク)、および入れ子集合モデルを調べました。私はまだ何が何であるかを解明しようとしていますが、これは非常に複雑なコンポーネントデータベースであり、複数の親があり、サブツリーへの変更は他のツリーを介して伝播する必要があります。さらに重要なのは、データベーススペースと入力中のクエリ時間を犠牲にしても、一般的な使用中の再帰を避けたい挿入、削除、およびツリービューがあることです。

4

0 に答える 0