我试图确定是否可以在sql中使用闭包表(和/或其他助手表)轻松地对有向循环图建模。
例如,假设我有这个有向图(全部指向下):
我在用闭包表建模时遇到问题。
我们会得到这张桌子:
(祖先、后代、路径长度)
(1,1,0)
(2,2,0)
(3,3,0)
(4,4,0)
(二、四、一)
(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;

第一个delete查询删除1和4之间以及3和4之间的路径,不应删除这些路径
我找不到一个闭包表来解决这个问题,如果4指向1,就会变得更加复杂。(变得循环)。
我找不到关于这个问题的很多文章。对于如何在sql中实现这种类型的图,或者sql对于这种类型的图不是一个好的选择,我将非常感谢您的任何输入。

最佳答案

我以前在闭包表中做过循环图。删除边要贵得多,但这是可以做到的。
首先你可以忘记路径长度。一个周期的路径长度是多少?无穷?放下那根柱子。
当你从图中移除一条边(父边,子边)时,你必须考虑从父边的祖先到子边的子边之间存在替代路径的可能性。所以在删除边之前,保存父代的所有子代-这些是潜在的替代路径。然后在删除边之后,将父级的祖先的子级重新添加到闭包表中,不包括重复的行。

08-19 15:24