级联删除导致多个级联路径

时间:2009-09-20 17:45:16

标签: sql-server database-design

我正在使用SQlServer 2008,下面显示了一些数据表的摘录:

用户

Id(PK)

UserItems

UserId(PK) ItemId(PK) - (2列的复合键) ...

UserItemVotes

UserId(PK) ItemId(PK) VoterId(PK) - (3列复合键)

我定义了以下关系:

  • User.Id - > UserItems.UserId
  • (UserItems.UserId,UserItems.ItemId) - > (UserItemVotes.UserId,UserItemVotes.ItemId)
  • UserId.Id - > UserItemVotes.VoterId

现在,打开级联删除时遇到问题。添加第三个关系时,我收到错误“...可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。” 我真的不想这样做,理想情况下,如果用户被删除我想删除他们的用户项和/或他们的投票。

这是一个糟糕的设计吗?或者有没有办法从SQL Server获得我想要的行为?

3 个答案:

答案 0 :(得分:12)

批准的答案不是一个好的答案。所描述的场景设计并不差,依靠数据库来完成其工作也没有“风险”。

最初的问题描述了一个完全有效的场景,并且设计经过深思熟虑。显然,删除用户应删除用户的项目(及其上的任何投票),并删除用户对任何项目(甚至是属于其他用户的项目)的投票。删除用户记录时,要求数据库执行此级联删除是合理的。

问题是SQL Server无法处理它。它的级联删除的实现是不足的。

答案 1 :(得分:0)

“UserItems.ItemId - > UserItemVotes.UserId”

这个似乎非常可疑。

答案 2 :(得分:-2)

我会导致糟糕的设计。虽然大多数DBMS可以管理级联删除,但使用此内置功能存在风险。您的场景是一个完美的例子,说明为什么这些类型的东西通常在应用程序代码中管理。在那里,您可以确切地确定需要删除的内容以及顺序。