在数据库中存储树结构,发出循环引用

时间:2013-05-20 12:06:30

标签: sql sql-server sql-server-ce

我正在开发一个业务管理系统,其中我使用层次结构管理方式将客户列表组织为树:

Customer A
  -- Customer B
    -- Customer C
  -- Customer D

我有一个表存储所有客户数据(名称,联系信息等)和另一个表来映射这棵树的关系:

CREATE TABLE customer_tree
(
 "fromID" int, 
 "toID" int, 
 CONSTRAINT "fk_from_tree_customer" FOREIGN KEY (fromID) REFERENCES CustomerNode(id), 
 CONSTRAINT "fk_to_tree_customer" FOREIGN KEY (toID) REFERENCES CustomerNode(id), 
 "id" int IDENTITY(1,1) PRIMARY KEY)

基本上fromID是父节点,toID是其中一个子节点的ID,为每个子节点插入一行。

现在,我遇到的问题是保持此表更新。每当我删除一个客户时,我都希望删除此表中的关系。我尝试使用类似这样的级联创建表:

 ... FOREIGN KEY (fromID) REFERENCES CustomerNode(id) ON DELETE CASCADE, 
 ... FOREIGN KEY (toID) REFERENCES CustomerNode(id) ON DELETE CASCADE

但数据库不允许我创建此表,因为它会导致现在允许的循环引用。在代码中检查树结构的循环节点,因此实际循环不会成为问题。但是,每当我删除节点时,我都希望自动删除这种关系。

有没有简单的方法来完成这项工作或解决循环参考检查?

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

您可以在CUSTOMER表上创建删除操作的触发器。

在此触发器中,您可以从customer_tree表中删除相应客户与删除客户相同的内容。

您可以构建触发逻辑,如下所示 -

CREATE TRIGGER ON Customer
  BEFORE DELETE    
BEGIN
  DELETE FROM Customer_Tree Ct
   WHERE Fromid IN (SELECT Id FROM Deleted)
      OR Toid IN (SELECT Id FROM Deleted)
END
GO

我实际上并不擅长SQL Server,但我从MSDN端找到了这个关键字。

Reference

答案 1 :(得分:0)

根据我的经验,答案是否定的。你必须从代码。您可以使用SQL Server中的hierarchyid数据类型进行调查。