我正在使用SQlServer 2008,下面显示了一些数据表的摘录:
Id(PK)
UserId(PK) ItemId(PK) - (2列的复合键) ...
UserId(PK) ItemId(PK) VoterId(PK) - (3列复合键)
我定义了以下关系:
现在,打开级联删除时遇到问题。添加第三个关系时,我收到错误“...可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。” 我真的不想这样做,理想情况下,如果用户被删除我想删除他们的用户项和/或他们的投票。
这是一个糟糕的设计吗?或者有没有办法从SQL Server获得我想要的行为?
答案 0 :(得分:12)
批准的答案不是一个好的答案。所描述的场景设计并不差,依靠数据库来完成其工作也没有“风险”。
最初的问题描述了一个完全有效的场景,并且设计经过深思熟虑。显然,删除用户应删除用户的项目(及其上的任何投票),并删除用户对任何项目(甚至是属于其他用户的项目)的投票。删除用户记录时,要求数据库执行此级联删除是合理的。
问题是SQL Server无法处理它。它的级联删除的实现是不足的。
答案 1 :(得分:0)
“UserItems.ItemId - > UserItemVotes.UserId”
这个似乎非常可疑。
答案 2 :(得分:-2)
我会导致糟糕的设计。虽然大多数DBMS可以管理级联删除,但使用此内置功能存在风险。您的场景是一个完美的例子,说明为什么这些类型的东西通常在应用程序代码中管理。在那里,您可以确切地确定需要删除的内容以及顺序。