问题标签 [transitive-closure-table]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3763 浏览

postgresql - 数据库中的分层数据:递归查询 vs. 闭包表 vs. 图数据库

我正在开始一个具有一些分层数据的新项目,并且我正在研究将其存储在数据库中的所有选项。

我正在使用 PostgreSQL,它允许递归查询。我还研究了关系数据库的设计模式,例如闭包表,并查看了图形数据库解决方案,例如 neo4j。

我发现很难在这些选项之间做出决定。例如:鉴于我的 RDBMS 允许递归查询,使用闭包表是否仍然有意义?在可维护性和性能方面与图形数据库解决方案相比如何?

任何意见/经验将不胜感激!

0 投票
1 回答
1677 浏览

mysql - MySQL分层数据帮助——闭表法

我正在尝试在 MySQL 中实现一个系统来存储分层数据。我决定使用Bill Karwin从第 40 张幻灯片开始描述的此处实现的系统。我正在尝试设置数据库,以便自动维护表。EntryPaths

更新:我已经稍微更新了数据库创建 SQL。我想,我有 1/2 的工作需要更新。运行数据库创建 SQL 后尝试以下操作

先看看这个条目长什么样

这个看起来如何

查看的第一个条目有几个孩子,第二个没有孩子。运行以下更新以将“College Years”节点(及其子节点)重新设置为John Doe

如果您重新运行上述两个 select 语句,您将看到项目已从其中删除,Jane Doe但并未John Doe按预期添加。触发器有问题,Library_Update但我没有办法尝试修复它。

数据库使用示例数据创建 SQL:

0 投票
1 回答
11819 浏览

mysql - MySQL Closure Table 分层数据库 - 如何以正确的顺序提取信息

我有一个 MySQL 数据库,它使用 Closure Table 方法保存分层数据。一个简单的示例数据库创建脚本遵循问题。我目前的问题是如何以正确的顺序从数据库中提取数据?我目前正在使用以下选择语句。

它提取正确的信息,但顺序不正确。

示例数据库使用示例数据创建脚本。

0 投票
4 回答
2797 浏览

sql - 与多个父母一起搬入闭包表

我有以下 DAG

这是关闭表

我将如何删除 path B > D(从而删除A > B > D)而不删除A > C > Dand C > D

现在我正在使用以下查询,但它仅在每个节点只有 1 个父节点时才有效。

0 投票
4 回答
2648 浏览

postgresql - PostgreSQL 将数据从递归 CTE 传递到函数

我有以下问题:我正在尝试发现从源节点(node_s)到目标节点(node_t)的所有可能路径。

带有图边的原始表格的格式很简单:| 节点_x | 节点_y | 实力 | ,其中“node_x”->“node_y”是直接边,边的强度为“权重”。

这个想法是,如果在探索路径期间的任何时候,我们发现其子节点中的一个节点具有目标node_t,我们记录该路径并停止从该节点探索路径,否则继续探索。

简单的解决方案是使用 PostgreSQL 的递归 CTE,它构造图的传递闭包:

上面的代码将从源节点node_s发现所有可能的路径。只有在传递闭包构造之后,我才能选择从源节点到目标节点的所需路径行(参见最后一个 SELECT 语句)。

例子:

best_path 表有以下数据:

询问:

找到从源节点 = 1 到目标节点 = 4 的路径

结果:

这不是我需要的。由于已经有从节点 2 到节点 4(目标)的直接边,我不需要路径 1.2.5.、1.2.4.8.、1.2.4.9.、1.2.5.10.、1.2.5.11.,路径探索对于节点 2,应该在发现从 2 到 4 的路径时停止。

总而言之,如果节点已经具有到目标节点的直接边缘,我不想发现节点的路径。这意味着在 CTE 的递归术语中,我希望有一些条件可以说明以下内容,伪代码如下:

作为查找从源节点 = 1 到目标节点 = 4 的路径的查询的结果,我想要以下内容:

在此先感谢您的帮助!

我已经尝试了很多方法:例如 FROM/WHERE 子句中的条件,尝试将 CTE 传递给函数,但没有成功。

任何建议将不胜感激。

我有自己的递归函数,可以实现我想要的,但是,在大量数据上它非常慢;而且 PostgreSQL 的 CTE 显然优化得很好,所以我想深入研究一下。

0 投票
1 回答
1497 浏览

php - codeIgniter 闭包表模型

这是我正在使用的课程:https ://gist.github.com/2174233

我有两张表:一张表包含用户,另一张表包含闭包。

当我使用get_children()方法时(比如说从根或另一个父级),它只显示层次结构的第一级。lvl 我应该在列中存储什么值?

这是闭包表的定义,我有:

这是我存储在闭包表中的数据示例:

最后是lvl列,但我不知道那里有什么值。你能给我一个如何使用它的建议吗?

我必须存储的结构有 3 个级别:根 -> 20 节点 -> 26 节点,但它只给了我第一级子节点,即 20 节点。

0 投票
1 回答
335 浏览

mysql - 闭包树中兄弟姐妹之间的唯一名称约束

我想知道在 MySQL 中使用闭包表对层次结构建模时,如何对兄弟节点的名称强制执行唯一约束。

这是我的架构:

使用此架构,我在spaces表上使用唯一约束来验证没有兄弟姐妹具有相同的名称。

这种方法的缺点是它对封装在space_paths表中的层次元数据进行了非规范化。这意味着我需要手动管理表中parent字段与spaces表中路径的一致性space_paths

有没有一种方法可以重新设计架构以使数据库在兄弟姐妹之间强制执行唯一名称约束而不必非规范化?

0 投票
2 回答
3210 浏览

sql - 在分层查询中查找“最深”的孩子

我需要一些帮助来查询分层数据。这是一个简单的表,其中对根条目的parent_id引用id和可能为空。

对于表中的每条记录,我需要找到具有最大 id 的最深的孩子。如果记录没有孩子,则应返回其自己的 id。我自己尝试过,但使用START WITH A.id = B.idwhere A 和 B 是子查询失败了,看起来 Oracle 不允许这样的连接。

这是示例数据:

和样本结果

0 投票
1 回答
748 浏览

mysql - MySql 闭包表不支持不同父类的重复子类

我一直在用这个封闭表转圈子。我遇到的问题是第二次出现后代。我有出现在多个父类别中的子类别实例。为了简单起见,我回到了这个例子:

使用以下查询,我可以获得所需的结果:

结果:

但是如果我添加另一个孩子,例如一个已经存在的孩子,我想让叶子节点成为 roottree -> lastbranch -> lastleaf 的孩子

我在闭包表中插入两条新记录:(6-5)和(7-5)

然后所有的地狱都崩溃了。我已经尝试了我能想到的一切,但我没有得到任何地方。

0 投票
0 回答
768 浏览

php - Closure Tables - 这是足够的数据来显示树视图吗?

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

我正在尝试使用 PHP 创建一个简单的树。似乎没有足够的数据来创建表。例如,当我纯粹看 parentId = 6 时:

我们知道第 8 部分和第 10 部分存在于第 7 部分或第 9 部分之下,但不是哪个。我们知道第 10 部分存在于 3 和 4 个节点深处,但在哪里?

如果我查看表中的其他数据,可以判断它应该是:

我认为闭包表的好处之一是不需要递归查询?你能帮忙解释一下我做错了什么吗?

编辑:为澄清起见,这是一个映射表。还有另一个名为“parts”的表,其中有一个名为 part_id 的列,该列与“closure”表中的 parentId 和 childId 列相关。上表(闭包)中的“id”列仅用于维护主键。这不是真的必要。我用来创建此闭包表的方法在以下文章中进行了描述:http: //dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html

EDIT2:它可以有两跳和三跳。我将通过为项目分配名称来更容易地解释。

螺母是螺栓的一部分。螺栓和螺母组合直接存在于 Bicycle 和作为 Bicycle 一部分的 Gears 中。

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