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

Sql server 级联删除导致多个级联路径,sql-server,database-design,Sql Server,Database Design,我使用的是SQlServer 2008,下面显示了一些数据表的摘录: 使用者 Id(主键) 用户项 用户标识(PK) ItemId(PK)-(两列的复合键) 用户项目投票 用户标识(PK) 项目ID(主键) VoterId(PK)-(3列复合键) 我定义了以下关系: User.Id->UserItems.UserId (UserItems.UserId,UserItems.ItemId)->(useritemdoves.UserId,useritemdoves.ItemId) UserId.

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

使用者 Id(主键)

用户项 用户标识(PK) ItemId(PK)-(两列的复合键)

用户项目投票 用户标识(PK) 项目ID(主键) VoterId(PK)-(3列复合键)

我定义了以下关系:

  • User.Id->UserItems.UserId
  • (UserItems.UserId,UserItems.ItemId)->(useritemdoves.UserId,useritemdoves.ItemId)
  • UserId.Id->useritemdoves.VoterId
现在,我在启用级联删除时遇到了一个问题。添加第三个关系时,我收到错误“…可能会导致循环或多个级联路径。请在“删除无操作”或“更新无操作”时指定,或修改其他外键约束。” 我真的不想这样做,理想情况下,如果用户被删除,我想删除他们的useritem和/或他们的投票


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

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

“UserItems.ItemId->useritemdoves.UserId”


这个答案似乎非常可疑。

经批准的答案不是一个好答案。所描述的场景设计不错,依赖数据库完成工作也不“有风险”

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


问题是SQL Server无法处理它。它的级联删除的实现是有缺陷的。

好的,我将在存储过程中执行此操作,而不是在这种情况下依赖父表来删除其子表。我认为DanDan说的是(UserItems.UserId,UserItems.ItemId)->(useritemdoves.UserId,useritemdoves.ItemId)。