gpt4 book ai didi

php - codeIgniter 闭包表模型

转载 作者:行者123 更新时间:2023-11-29 06:06:19 24 4
gpt4 key购买 nike

这是我正在使用的类(class):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 节点。

最佳答案

我建议您选择SQL Antipatterns书。第二章将闭包表作为实现类别树的推荐方法之一。

也就是说。看起来你的闭包表有点奇怪。那里的 id 列没有意义。相反,您应该有一个复合主键,由唯一的祖先值和后代值对组成。

并且您还没有插入节点本身..仅插入两个不同节点之间的连接。也许正在阅读"Rendering Trees with Closure Tables"可以为这个主题提供一些启发。

据猜测,INSERT 语句应该如下所示(至少 my conclusion ):

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);

您必须了解的是,闭包表并不存储树。相反,您正在使用的数据结构是有向图。像这样:

enter image description here

正如您所看到的,该图有三个根节点:3、5 和 7。此外,需要注意的是,节点 10 具有不同的深度级别,具体取决于来自从哪个根节点开始。

它将用两个闭包定义:[3,10,1]和[11,10,2]。这意味着,从第 11 个节点开始的连接会将其置于二级,而从第 3 个节点开始,它是第一级项目。

事实是,当您使用闭包表时每个类别可以有多个父类别,每个父类别的深度级别不同

<小时/>

添加(@ypercube):

我对“级别”或“深度”列的理解是,它存储从祖先到后代的“距离”(需要走的步数)。它不是节点的绝对级别,因此闭包表可用于存储比 TreeMap 更复杂的数据。您甚至可能有从祖先到后代的多条路径,每条(路径)都有不同的步骤。

此外,Null 应该为 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) ;

关于php - codeIgniter 闭包表模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com