问题标签 [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 投票
0 回答
240 浏览

database - 使用 SQLite 在给定深度的数据库表中查找闭包

我有下表:(我正在使用 sqlite)

我需要找到i给定深度的特定闭包。但是,对于 SQLite,我不能使用递归查询。我尝试编写一个查询,但无法有效地调用它以获得所需的结果:

这列出了深度为 2 的所有闭包。但在我的特定用例中,我需要允许深度为 8 的闭包。

使用这种类型的查询,我可以尝试:

这将返回深度为 3 的闭包,但有冗余的选择查询。有没有更好的方法来找到闭包?

0 投票
1 回答
1511 浏览

sql - 在带有 JOIN 的闭包表上运行 SELECT 查询?

我设置了一个应用程序,其中包含附加到帖子的嵌套评论。我决定使用闭包表方法(幻灯片 40)来发表评论,因为硬盘空间是多么便宜,而查询和管理树结构似乎多么容易。但是,我遇到了一个问题。我似乎无法弄清楚如何根据帖子 ID 而不是祖先 ID(幻灯片 49)获取树路径。

我的数据库结构如下所示:

如果我事先知道 parent_id,就像在幻灯片中一样,抓取树很简单:

parent_id但是,我事先不知道;我只知道post_id. 数据库的设置方式,与帖子关联的树不止一棵:

我最初的解决方案是这样的查询:

它返回正确的数据,但我觉得这样的嵌套 SELECT 是不正确的。有一个更好的方法吗?

谢谢!

0 投票
2 回答
3210 浏览

python - 从闭包表 SELECT 语句中渲染树?

[上一个问题]

我正在尝试向应用程序添加类似 reddit 的评论,我决定使用闭包表模式来组织数据库。我的应用程序数据库看起来有点像这样:

帖子

评论

评论路径

现在,我正在运行这个查询:

获取基于他们的评论列表post_id。返回的数据是:

这代表树:

但是,我正在努力将返回的数据转换为 Python 树结构。本质上,我的目标是这个问题这个关于最终输出 (HTML) 的问题,但我真的不想求助于递归 SQL 语句,因为我已经有了这些信息。我认为某种递归是必要的,因为我希望最终得到与此类似的结构:

基本上是一个嵌套的字典列表,所以我可以使用Jinja 的递归循环遍历它们。有人有想法吗?

谢谢!


编辑 2013-04-17

乱七八糟,我有一个“工作”的解决方案,虽然它做了很多迭代,所以我不想把它标记为这个问题的答案。我使用的解决方案是:

comment_set这并不理想,因为它会在每次调用时迭代create_tree(),即集合中的每条记录。然而,这是我目前拥有的最好的。有人有什么想法吗?

0 投票
1 回答
547 浏览

mysql - 使用闭包表对分层数据进行分页(MySQL)

我正在尝试查询按score. score是一个整数,comments 表有一个自引用parent_id列。

每个页面应至少有一个根评论,后跟它的子评论。如果数据集中只有一个根评论,则只会返回一页。

因此,给定表中的以下数据comments

我希望能够SELECT * FROM comments......LIMIT 4 OFFSET 0并让第 1 页成为:

第 2 页是:

第 3 页为空白,因为没有根评论。

我正在使用Bill Karwin所描述的支持闭包表,因为可以使用任何评论作为根评论来独立查看评论子树,这似乎是最好的解决方案。

相关表格的结构和样本数据如下:

0 投票
1 回答
8925 浏览

sql-server - 分层 SQL 数据(递归 CTE vs HierarchyID vs 闭包表)

我有一组在 SQL Server 数据库中使用的分层数据。数据以 guid 作为主键存储,parentGuid 作为指向对象直接父对象的外键存储。我最常通过 WebApi 项目中的实体框架访问数据。为了使情况更复杂一点,我还需要基于此层次结构管理权限,以便应用于父级的权限适用于其所有后代。我的问题是这样的:

我已经搜遍了,无法决定哪种方法最适合处理这种情况。我知道我有以下选择。

  1. 我可以创建Recursive CTEs通用表表达式(又名 RCTE)来处理分层数据。这似乎是正常访问最简单的方法,但我担心在用于确定子对象的权限级别时它可能会很慢。
  2. 我可以在表中创建一个hierarchyId数据类型字段并使用 SQL Server 提供的函数,GetAncestor()IsDescendantOf()通过插入和移动
  3. 我可以创建一个closure table,它将所有关系存储在表中。我想象它是这样的:父列和子列,每个父->子关系都将被表示。(即 1->2 2->3 将在数据库中表示为 1-2、1-3、2-3)。缺点是这需要插入、更新和删除触发器,尽管它们相当简单,而且这种方法会生成大量记录。

我已经尝试过搜索,在这三种方法之间找不到任何建议。

PS我也对这个问题的任何替代解决方案持开放态度

0 投票
2 回答
470 浏览

php - 关闭表中的多个垂直菜单

我正在寻找一些像这里这样的多个垂直菜单。我不想要任何下拉菜单。我在我的 mysql 数据库中为类别使用典型的闭包表层次结构(祖先/后代/深度),我想渲染它们。要从数据库中获取所有父母和孩子,我有以下方法:

在演示者中,我刚刚:

因为我使用的是 Nette 框架,所以我使用的是 Latte 模板引擎,这与 Smarty 非常相似。为了与父母和孩子一起渲染所有类别,我有这个:

我最大的问题是如果我想要三层或更多级别的菜单,如何制作 css 样式。如果选择了某个类别,则显示他的子类别,而隐藏另一个类别。当被选中时,一些子类别显示他的子类别而另一个子类别隐藏等等。真的感谢您的提前,我很抱歉我的英语。希望你知道我的意思。

0 投票
1 回答
1824 浏览

sql - 包含级别/距离列的闭包表 INSERT 语句

我指的是Bill Karwin 的演示文稿,以实现一个有助于我管理层次结构的闭包表。不幸的是,演示文稿没有显示我如何插入/更新Level幻灯片 67 中提到的列;这将非常有用。我一直在考虑,但我无法提出可以测试的具体内容。这是我到目前为止得到的:

我不确定我该怎么做。有任何想法吗?

0 投票
3 回答
2950 浏览

sql - 如何有效地维护传递闭包表?

我的关系数据库(Firebird)中有一个 DAG,有两个表edgenode(邻接列表模型)。我想递归地查询它们,但发现递归查询效率很低。所以我尝试实现触发器来维持 Dong et.al 之后的传递闭包。论文http://homepages.inf.ed.ac.uk/libkin/papers/tc-sql.pdf

SELECTs 现在非常快,但DELETEs 非常慢,因为几乎整个图形都被复制以进行一次删除。更糟糕的是,并发更新似乎是不可能的。

有没有更好的方法来实现这一点?

编辑

我做了一些实验,并为 TC 表引入了一个引用计数器。这样,删除速度很快。我写了一些简单的测试用例,但我不确定我是否做得对。这是我到目前为止所拥有的:

这是我自己的想法,但我认为其他人已经实施了 TC。他们在做同样的事情吗?

我有一些测试用例,但我不确定我是否会与更大的图表不一致。

并发性怎么样,我认为当两个同时的事务想要更新图表时,这种方法会失败,对吧?

编辑

我在我的代码中发现了一些错误,我想与你分享修复版本。

我发现了一篇很棒的文章: http: //www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclic-Graphs-DAG-o。是否有更多有趣的文章或科学论文,采用不同的方法?

0 投票
0 回答
134 浏览

transitive-closure-table - 用户\组管理的关闭表?

你们中的任何人曾经使用过闭包表来表示层次用户组吗?在我在网上找到的所有示例中,节点的 id 在结构中始终是唯一的。

尝试想象这个问题:在我的软件中的经典安全管理中,我有一个用户列表和一个组列表,我想确保一个用户可以属于多个组,每个组又可以包含其他组.

用户表:

身份证 | 用户类型 | 姓名

(如果记录代表用户,则 UserType 为 0,如果是组 1)

表 UserHC Id | 父 ID | 等级

分析插入已知的经典命令,如果“MyID”已经存在(因为主键是 Id,ParentId),那就不好了。

INSERT INTO UserHC ( [Id], [ParentId], [Level] ) select {MyID} as [Id], [ParentId], [Level] +1 from UserHC where [Id] = {myid} UNION ALL SELECT {MyID} , {myId} , 0

*其中 MyId 是新的 Users.Id

在我进行复杂分析之前,我想知道你们中是否有人已经有类似的要求以及如何解决它。

谢谢

0 投票
1 回答
296 浏览

mysql - 具有多种数据类型的闭包表?

我最近一直在更新我的 MySQL,我需要用分层数据创建一个数据库。

我有几种不同类型的数据需要以树格式表示,但不知道如何去做。

例如,假设我有一个人,可以雇用或被其他人雇用。这些人中的每个人都可能有设备检查给他们,每件设备必须有一个名称、描述和更换零件清单,每个更换零件必须有成本等。

我看到的大多数闭包表的例子都集中在它们在处理论坛或线程评论方面有多棒。如何制作具有多种数据类型的闭包表?