如何约束邻接列表表以排除其隐含图中的循环?

时间:2012-12-09 19:44:06

标签: sql postgresql database-design

我有一个包含两列的表:节点ID和父节点ID。该表代表一个图表。我希望它代表一棵树,所以我需要禁用在图中形成循环的行的插入。

1 个答案:

答案 0 :(得分:1)

以下方法不起作用,因为您可以批量插入行以创建循环http://sqlfiddle.com/#!12/ea0cd/7

您可以通过一次只允许通过存储过程进行插入访问来解决它。

创建一个自引用ParentId的表格:

Create Table Tree (
  Id int not null primary key,
  ParentId int foreign key references Tree(Id) -- might need to add constraint afterwards
);

不允许更新表,只允许插入和删除。如果没有更新,则无法创建循环。

如果您的树节点有其他数据,那么为此创建一个单独的旁观表:

Create Table Node (
  Id int not null primary key,
  data1 varchar(10),
  constraint FK_Tree Foreign Key (Id) References Tree (Id)
);