闭包表 - 这是否足以显示树视图?

时间:2012-09-04 14:45:29

标签: php mysql tree directed-acyclic-graphs transitive-closure-table

这是我通过测试闭包表方法创建的表。

|    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部分之下,但不是第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

坚果是博尔特的一部分。 Bolt和Nut组合直接存在于Bicycle内部和Gears内,后者是Bicycle的一部分。

关于使用什么方法,我查看了邻接,边缘,枚举路径,闭包,DAGS(网络)和嵌套集模型。我仍在尝试找出什么是什么,但这是一个非常复杂的组件数据库,其中有多个父项,并且对子树的任何修改都必须通过其他树传播。更重要的是,我希望在一般使用过程中避免递归,这是插入,删除和树视图,即使以进入期间的数据库空间和查询时间为代价。

0 个答案:

没有答案