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

sql-server-2005 - 如何在 SQL SERVER 2005 中让父母给孩子一个孩子

我有一张这样的桌子

如果我将 childid 设为 5,则 parentid 将为 1(输出)

如果我将 childid 设为 9,则 parentid 将为 7。(输出)

即根 parentid 为 0,查询应该停在那里。

如何解决这样的查询?

请帮忙。

0 投票
3 回答
681 浏览

sql - 如何查询树中两个节点之间的所有节点?

我有一个分层数据库结构,例如列IDPARENT_ID为每一行定义,顶层行具有NULL PARENT_ID.

我将这个表中的所有关系展平到另一个表中,例如,如果祖父母、父母、孙子的单个层次结构中有 3 条记录,则将有 3 条记录:

与其执行分层查询来确定孙子是祖父的后代,我可以简单地检查(grandparent, grandchild)这个扁平表中是否存在记录。

我的问题是,使用这个扁平表,我怎样才能最有效地返回两个节点之间的所有记录。使用示例,使用grandparentgrandchild作为我的参数,我怎样才能取回(grandparent, parent)记录。

我不想使用分层查询来解决这个问题......我想知道是否可以在没有任何连接的情况下做到这一点。

0 投票
2 回答
3210 浏览

mysql - mySQL 传递闭包表

我有一些我一直在 SQL Server 中使用的代码来从另一个只有直接父/子关系的表生成一个闭包表,我可以对此运行非常简单的查询来确定沿袭。现在我需要在 mySQL 中完成所有这些工作,但是我在使用递归查询来生成闭包表时遇到了麻烦......

我原来的 SQL 服务器查询是

我的第一个问题是找到@@ROWCOUNT 的替代品...但也许递归查询在 mySQL 中完全不同?我还查看了Bill Karwin 的演示文稿

PS。由于性能问题,我需要“COLLATE DATABASE_DEFAULT”。

谢谢。

0 投票
3 回答
376 浏览

sql - 如何加快寻找传递闭包根节点的查询?

我有一个代表树的历史传递闭包表。

以下是一些示例数据:

不幸的是,我当前查找根节点的查询会导致全表扫描:

从表面上看,它看起来并不太贵,但是当我接近 100 万行时,这个特定的查询开始变得令人讨厌......尤其是当它是一个视图的一部分时,它会为遗留支持获取邻接树。

有没有更好的方法来找到传递闭包的根节点?我想重写我们所有的旧遗留代码,但我不能......所以我需要以某种方式构建邻接列表。获取除根节点之外的所有内容都很容易,那么有没有更好的方法?我是否以错误的方式思考这个问题?

对具有 800k 行的表的查询计划。

0 投票
1 回答
1888 浏览

sql - 更新闭包表的最佳方法是什么?

我有一个使用邻接表方法关联记录的表(表A),以及另一个使用闭包表关联相同记录的表(表B)。它们都捕获相同的图表,因此它们都需要保持同步。

问题是,更新闭包表的最佳方法是什么?

在我看来,有三种选择:

  1. 触发器。在A处的 INSERT/UPDATE/DELETE 上,运行一个计算新闭包的存储过程。 缺点:A 的更改会导致长时间的同步(锁定?)操作;可能的死锁(?)。
  2. 应用代码。将A中的更改缩小到 Add/Update/Delete 方法(例如存储库模式),并通过调用计算新闭包的 sproc 来重载它们。 缺点:额外往返数据库;如果另一个thead同时以相反的方式修改AB ,可能会出现完整性问题;例如,如果另一个应用程序决定修改A而不是B ,则可能存在完整性问题。
  3. 后台更新程序。编写一个辅助进程,不断寻找对A的更新并对闭包表进行相应的更新。 缺点:复杂(编写和管理的额外服务);没有同步的窗口。

即使没有“最佳”选项,任何关于权衡的想法都将不胜感激!

0 投票
1 回答
948 浏览

php - 打印一个完整的传递闭包树

在我们的在线商店 (PHP/MySQL) 上,对于我们的类别结构,我们使用 Bill Karwin 描述的传递闭包表(祖先、后代、长度)。

我发现它非常灵活和有用,但不知道如何在没有递归的情况下打印完整的类别树。这可能吗?

例如,我想要一个类似于以下内容的输出:

  • 声音的
    • 便携的
      • MP3
  • 计算
    • 光驱
      • DVD-RW
    • 输入设备
      • 无线
        • 键盘
  • 家用设备
  • 电视
    • 液晶显示器
      • 宽屏
    • 阴极射线管

可选地受总类别深度的限制。

这是该模型的限制,还是有解决方法?目前我一直在使用递归并缓存结果。

0 投票
1 回答
893 浏览

python - SQLAlchemy 是否支持“关闭表”?

我一直在阅读关于闭包表作为通过 SQL 建模层次结构的一种方式。

[SQLAlchemy] 是否对使用闭包表创建和遍历对象实例的分层集合(树结构集合)有任何内置支持?

0 投票
0 回答
892 浏览

mysql - 关闭表的 MySQL 查询

当前用户表:

当前的 USER_RELATIONS 表:(它有 2 个外键 - 祖先->USER.id - 后代->USER.id)

当前 TRANSACTIONS 表:(它有 1 个 FOREIGN KEY - chid->USER.id)

所有关系均已正确设置,并在用户加入并输入引用他的另一个用户的引用时创建,从而创建层次结构树。

以前我试图正确地进行此设置,并从“Puggan Se”那里得到了一些很大的帮助,他向我指出了 Closure Tables 的方向。

目前,我可以看到单个原始引用者(祖先)及其所有引用用户(后代)的整个树。我们还设置了一个自动调平系统,该系统将调平每个参考了预定义数量的后代的用户。

我们现在已经添加了一个商店,并希望给每个用户一些东西作为他们的参考,并邀请其他用户加入和购物。“小东西”基本上是销售额的百分比,基于它们的树结构。

解释:

问题:我希望有人检查 MySQL 查询并告诉我是否正确执行。我想在后代状态<祖先状态的祖先树中获取所有后代的总交易和总支出。有人可以帮忙吗?目前我为每个关系运行它 4 次。长度/状态 = 因为有 4 个低于最高的状态级别,即 4。

查询:

现在每次 t2.status 增加到不等于祖先状态并且 t1.length 减小到 1,因为 length = 0 是祖先本身。

我的假设和方法是否正确,或者有更简单的方法吗?

0 投票
1 回答
1801 浏览

mysql - 根据表的子查询更新表

我正在为某些页面层次结构使用闭包表。我希望能够删除一个页面并更新它离开的孩子的级别。

在删除第 3 页之前,我尝试更新级别,然后删除第 3 页的记录,目标是:

用一个(无效的)suquery 来描述它,如下所示:

这显然在更新上失败了。

理想情况下,希望在一个查询中完成,但如果 tmp 能够完成,那么就这样吧 - 在这方面的表现比甜蜜的 sql 甜蜜更重要......

0 投票
3 回答
4051 浏览

mysql - 闭表最好的SELECT QUERY

我正在为 MySQL 和 PHP 开发线程评论系统。我选择了 Closure Table 模式,但我有问题。我需要查询(查询)来获取整棵树。怎么做?我对此进行了很多搜索,但找不到任何最佳选择。如果您有更好的主题评论,请告诉我。谢谢你的回复。