这是我通过测试闭包表方法创建的表。
| 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
我认为闭包表的好处之一是不需要递归查询?你能帮忙解释一下我做错了什么吗?
编辑:为澄清起见,这是一个映射表。还有另一个名为“parts”的表,其中有一个名为 part_id 的列,该列与“closure”表中的 parentId 和 childId 列相关。上表(闭包)中的“id”列仅用于维护主键。这不是真的必要。我用来创建此闭包表的方法在以下文章中进行了描述:http: //dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html
EDIT2:它可以有两跳和三跳。我将通过为项目分配名称来更容易地解释。
Part 6 = Bicycle
Part 7 = Gears
Part 8 = Chain
Part 9 = Bolt
Part 10 = Nut
螺母是螺栓的一部分。螺栓和螺母组合直接存在于 Bicycle 和作为 Bicycle 一部分的 Gears 中。
关于使用什么方法,我查看了邻接、边、枚举路径、闭包、DAGS(网络)和嵌套集模型。我仍在尝试弄清楚什么是什么,但这是一个极其复杂的组件数据库,其中有多个父级,并且对子树的任何修改都必须通过其他树传播。更重要的是会有插入、删除和树视图,我希望在一般使用期间避免递归,即使以数据库空间和进入期间的查询时间为代价。