closure table mysql,mysql – SQL中带有闭包表的定向循环图

我正在尝试确定是否可以使用SQL中的闭包表(和/或可能的其他帮助表)轻松建模有向循环图.

例如,假设我有这个有向图(所有指向下方):

我在使用闭包表进行建模时遇到了麻烦.

我们会得到这个表:

>(祖先,后代,路径长度)

>(1,1,0)

>(2,2,0)

>(3,3,0)

>(4,4,0)

>(2,4,1)

>(3,4,1)

>(1,4,2)

在移除1和2之间的边缘时,关闭表会崩溃.

DELETE FROM closure WHERE descendant IN

(SELECT descendant FROM closure WHERE ancestor=2);

DELETE FROM closure WHERE descendant=2 AND ancestor=1;

第一个删除查询删除1到4和3和4之间的路径,不应删除这些路径

我无法通过闭包表找到解决方案,如果4指向1,则会变得更复杂.(变为循环).

我还没有找到关于这个主题的大量文章.我很感激有关如何在SQL中实现这种类型的图形的任何输入,或者对于这种类型的图形而言SQL不是一个好的选择.

解决方法:

我之前在闭包表中完成了循环图.删除边缘要贵得多,但可以做到.

首先,你可以忘记路径长度.循环的路径长度是多少?无穷?删除该列.

当您从图中删除边(父,子)时,您必须考虑从父母的祖先到孩子的孩子的替代路径的可能性.因此,在删除边缘之前,保存所有父母的祖先的孩子 – 这些是潜在的替代路径.然后,在删除边缘后,将父级祖先的子项重新添加到闭包表中,不包括重复行.

标签:mysql,sql,transitive-closure-table

来源: https://codeday.me/bug/20190624/1279801.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值