0

我在具有 ID 和 ParentID 的数据库中有一个邻接列表来表示树结构:

-a
--b
---c
-d
--e

当然,在一条记录中,ParentID 永远不应与 ID 相同,但我还必须防止循环引用以防止无限循环。这些循环引用理论上可能涉及超过 2 条记录。( a->b、b->c、c->a 等)

对于每条记录,我将路径存储在一个字符串列中,如下所示:

a    a
b    a/b
c    a/b/c
d    d
e    d/e

我现在的问题是:插入/更新时,有没有办法检查是否会发生循环引用?

我应该补充一点,我了解嵌套集模型等。我选择了存储路径的邻接方法,因为我发现它更直观。我让它与触发器和一个单独的路径表一起工作,它就像一个魅力,除了可能的循环引用。

4

2 回答 2

2

如果您要这样存储路径,则可以检查该路径是否不包含 id。

于 2011-02-20T15:12:55.927 回答
0

如果您使用的是 Oracle,您可以使用 CONNECT BY 语法来检查循环。节点数应等于根节点的后代数。

CHECK (
(SELECT COUNT(*) Nodes
 FROM Tree) =
(SELECT COUNT(*) Decendents
 FROM Tree
 START WITH parent_node IS NULL -- Root Node
 CONNECT BY parent_node = PRIOR child_node))

请注意,您仍然需要其他检查来强制执行该树。IE

具有空值的单个根节点。节点可以只有一个父节点。

您不能使用子查询创建检查约束,因此需要转到视图或触发器。

于 2013-04-16T14:56:15.967 回答