我正在尝试确定是否可以使用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