问题标签 [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 回答
270 浏览

sql - 如何在 fluent api 和 EF 中使用复合键构建自引用表

我正在构建一个带有“闭包表”的分层数据库来构建树它是一个自引用表,两个键应该成为主键。

问题是,当我期望只有 3 列时,我最终得到 5 列。

这是我尝试过的:

结果是一个包含 5 列的表:

  1. 任务 ID
  2. ChildId
  3. 长度
  4. Child_TaskId
  5. Child_ChildId

我期望:

  1. 任务 ID
  2. ChildId
  3. 长度

我猜想缺少一些流利的 api,但否则我无法开始工作?

0 投票
3 回答
7157 浏览

sql - 如何使用邻接列表中的数据创建闭包表?

我有一个数据库,其中包含使用邻接列表模型存储的类别层次结构。

层次结构为 3 级深(不包括虚构的根节点),包含大约 1700 个节点。第 2 层和第 3 层的节点可以有多个父节点。一个附加表用于多对多关系,如下所示:

如果我转而使用传递闭包表方法(为了数据完整性等),是否可以执行一个相对简单的查询来生成闭包表的值?(使用 SQL Server 2005)

我已经浏览了诸如 Bill Karwin 的分层数据模型之类的文章和演示文稿,但它只包含针对单个节点的插入查询,而且我要花很长时间才能创建这样的树。

谢谢。

编辑:
CategoryHierarchy 表中的 RelID 纯粹是为了主键,它与 Category 表的节点 ID 无关。

同样通过闭包表,我的意思是这样的表:

其中前两列是复合主键,并且分别是 Category.id 的外键。

0 投票
1 回答
4187 浏览

sql - 如何从闭包表中显示 HTML 中的树结构

我在 MySQL 中存储了一些分层数据。由于各种原因,我决定使用闭包表(而不是嵌套集、邻接表等)。到目前为止,它对我来说一直很好,但现在我正试图弄清楚如何在 HTML 中实际显示这棵树(即使用正确的缩进)。

举个例子,假设我有一棵这样的树......

  • 食物
    • 水果
      • 苹果
    • 蔬菜
      • 萝卜



我的“食物”表看起来像这样......



我的“关闭”表将如下所示......



现在我想知道如何才能在 HTML 中正确显示它,最好是这样......

...这将以项目符号形式显示我的树,就像我的问题开始时一样。无论如何,任何帮助将不胜感激!

查尔斯

0 投票
1 回答
3428 浏览

transitive-closure-table - 寻找图的传递闭包

我正在尝试计算图的传递闭包。让我们以这个图为例(图片描述了这个图,它的邻接和连接矩阵): 在此处输入图像描述

使用我在此页面上找到的 Warshall 算法,我生成了这个连接矩阵(=传递闭包?),这与图片中的不同:

我也尝试过使用这个小程序,它也给了我不同的结果:

所以我现在有点困惑,因为我不知道哪个矩阵是正确的。有人可以阐明我的问题吗?

0 投票
1 回答
502 浏览

ruby-on-rails - Implementing version history with a closure table schema

I have a custom CMS implementation that stores content nodes in two tables as described in the "closure table" section at http://www.slideshare.net/billkarwin/models-for-hierarchical-data and using this gem https://github.com/mceachen/closure_tree under Ruby on Rails 3 and MySQL.

The time has come for me to implement a version history where any change in the content tree (editing, inserting, moving, deleting nodes, etc.) would create a new version of the root node (a publication). And users would be able to look at older versions and revert back to them. The revert action would create a newer version which is a copy of the reverted one.

Is there a well known way to achieve this? or does anyone have an idea or example implementation for this sort of thing?

Any input will be appreciated.

0 投票
1 回答
7084 浏览

mysql - 对闭包表分层数据结构中的子树进行排序

我想请您帮助我解决存储为闭包表的分层数据结构的排序问题。

我想用这个结构来存储我的网站菜单。一切正常,但问题是我不知道如何按自定义顺序对确切的子树进行排序。目前,树按照项目添加到数据库的顺序进行排序。

我的结构基于Bill Karwin关于 Closure Tables 的文章和其他一些帖子。

这是我的 MySQL 数据库结构和一些 DEMO 数据:

这是我对一棵树的 SELECT 查询:

对于 __ROOT_ = 1 的 DEMO 实例,查询获得:

但是,如果我例如需要更改 Cat 1.1 和 Cat 1.2 的顺序(根据名称或某些自定义顺序)怎么办?

我看过一些面包屑解决方案(如何按面包屑排序),但我不知道如何生成和更改它们。

0 投票
2 回答
1039 浏览

sql - 从传递闭包表中找到最小公共祖先

我有一个表表示组织层次结构的传递闭包(即,它是一个具有单个根的树):

我有另一个表,其中包含每个用户被允许访问的组织:

系统向用户显示与用户可以访问的每个组织相关的支出汇总。我总是可以首先向用户展示公司的视图(即根),向用户展示直接子组织的列表以及他的组织对总数的贡献。在大多数情况下,只有一个孩子,并且用户需要在看到多个孩子之前向下钻取几个级别。我更愿意从第一个显示多个孩子的组织(即 LCA)开始演示。

对于给定的用户,我可以很容易地找到到根目录的路径集,但在找到最不共同的祖先时遇到了麻烦。我正在使用 postgresql 9.1,但更喜欢与数据库无关的解决方案。在最坏的情况下,我可以将 root 的路径拉回到应用程序的代码中并在那里计算 LCA。

0 投票
1 回答
263 浏览

mysql - SQL查询在邻接表/闭包表中找到最终覆盖的ID

我有一个名为的邻接表(为了便于递归attribute,它还有一个名为 mapped 的闭包表)。attribute_closure

表中的每个条目attribute都是 4 种分层类型之一,每种类型都可以继承覆盖其父类型的条目。按层次结构,四种可能的类型是categoryproduct_lineproductmodel。所以category定义了一个属性树,它继承并且可以在任何时候覆盖,product_line等等。productmodel

这是预先存在的应用程序的预先存在的结构,因此任何重组建议都是不可用的:-)

因此,邻接列表attribute具有以下列:id, parent_id, overrides_idoverrides_id(如果设置)是对 的引用attribute.id,对于 也是如此parent_id。如果overrides_id设置,parent_id将始终匹配被覆盖属性的值parent_id

对于每个层次类型,都有一个将类型映射到属性的支持表,即 - category_id, attribute_id

我需要能够取回完整的属性树,并尊重所有覆盖。

示例数据(此特定示例仅涉及产品级别,但您明白了)。请根据需要使用您自己的示例数据进一步充实。

attribute

category_attribute

product_line_attribute

product_attribute

查询包含上述属性的树,应该只30955返回属性 id,因为显示的其他 2 个属性应该在 30955 之前被废弃。

如前所述,我还有一个典型的闭包表,它映射出ancestor, descendant, level. 如果您可以包含使用闭包返回具有覆盖已生效的树的结果,则额外加分。:-)

0 投票
2 回答
818 浏览

mysql - 并发编辑闭包树层次结构时的死锁

当使用closure_tree同时操作一组具有层次结构的公共属性的模型时,如何避免数据库死锁?

它们有以下几种口味:

发出时#append/prepend_sibling

重建闭包表时

with_advisory_lock看起来很有希望。有什么想法吗?

0 投票
1 回答
1287 浏览

python - Django ORM 和闭包表

我正在尝试使用闭包表对组织为分层树的数据进行建模。表示树中节点的条目并不花哨,定义如下。

节点之间的路径使用以下闭包表定义。它由到祖先节点的 FK、到后代节点的 FK 以及祖先和后代之间的路径长度(即节点数)组成:

现在我将如何检索所有Region行及其各自的父节点(即 RegionPath.PathLength = 1)?我的 SQL 有点生锈,但我认为 SQL 查询应该是这样的。

非常感谢使用 Django 的 QuerySet API 表达这一点的任何帮助。