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