这是我正在工作的类:https://gist.github.com/2174233
我有两个表:一个表包含用户,另一个表包含闭包。
当我使用get_children()方法(比方说来自根或另一个父方法)时,它只显示层次结构的第一级。我应该在lvl列中存储哪些值?
这是闭包表的定义,我有:
CREATE TABLE closures (
id INT(11) NOT NULL AUTO_INCREMENT,
ancestor INT(11) NOT NULL,
descendant INT(11) NOT NULL,
lvl INT(11) NOT NULL,
PRIMARY KEY (id)
)下面是我存储在闭包表中的数据示例:
INSERT INTO `closures` (`id`, `ancestor`, `descendant`, `lvl`)
VALUES (1, 1, 20, 0),
(4, 20, 26, 0),
(5, 26, 25, 0);最后一个是lvl列,但我不知道那里有什么值。你能给我一个如何使用它的建议吗?
我必须存储的结构有3个级别:根-> 20节点-> 26节点,但它只给出了第一级子节点,即20个节点。
发布于 2012-07-08 03:02:39
我建议你拿起SQL反模式的书。第二章将闭包表作为实现类别树的推荐方法之一。
这就是说。看起来你的闭表有点奇怪。在id列中没有任何意义。相反,您应该有一个由祖先和后代值的唯一对组成的复合主键。
而且您还没有插入节点本身。只有两个不同节点之间的连接。也许阅读“用闭包表绘制树”可以在这个问题上得到一些启示。
据猜测,INSERT语句应该如下所示(至少是我的结论):
INSERT INTO closures(ancestor, descendant, lvl)
VALUES (1, 1, null),
(20, 20, null),
(26, 26, null),
(28, 28, null),
(1, 20, 1),
(20, 26, 2),
(26, 25, 3);您必须理解的是闭包表没有存储树。相反,您正在使用的数据结构是方向图。就像这样:

正如您所看到的,这个图有三个根节点: 3、5和7。另外,非常重要的是,节点10是一个不同的深度级别,这取决于您从哪个根节点开始。
它将被定义为两个闭包:3、10、1和11、10、2。这意味着,来自第11节点的连接将将其定义为二级,而从第3节点开始,它是第一级项。
问题是,当您使用闭包表时,每个类别可以有多个父类别,每个父类别处于不同的深度级别。
加法(由@ypercube):
我对“级别”或“深度”列的理解是,它存储从祖先到下行者的“距离”(steps )。它不是节点的绝对级别,因此可以使用闭包表来存储比树图更复杂的内容。您甚至可以有从祖先到后代的多条路径,每条路径都有不同的步骤。
另外,Nulls应该是0,还需要几行。
因此,数据将是:
INSERT INTO closures(ancestor, descendant, lvl)
VALUES ( 1, 1, 0), (20, 20, 0), (26, 26, 0), (25, 25, 0),
( 1, 20, 1), (20, 26, 1), (26, 25, 1),
( 1, 26, 2), (20, 25, 2),
( 1, 25, 3) ;https://stackoverflow.com/questions/11378692
复制相似问题