循环或多个级联删除

时间:2015-04-14 22:14:15

标签: c# sql architecture database-schema

我有以下结构: enter image description here

  • 每个人都有具体区域
  • 每个项目都有具体的区域,每个项目都有具体的人。
  • 所有字段都不可为空(只有一个关系)

标准的“实时”情况,业务逻辑是正确的。 DB也是正确的,工作正常。但是,当我为这些关系中的每一个添加级联删除时,我得到错误:

'Persons' table
- Unable to create relationship 'FK_Persons_Areas'.  
Introducing FOREIGN KEY constraint 'FK_Persons_Areas' on table 'Persons' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

我理解为什么会这样(级联删除)。例如,如果删除区域,则应删除具有此AreaID的所有项目,并删除具有此AreaID的每个人员,然后删除所有已删除人员的项目... 如何解决这个问题呢?我试图再添加一个名为ProjectAreas的表:

enter image description here

但这并没有解决问题。此外,没有清楚地了解Project只有一个区域。

第二个问题 - 是否真的有必要解决这个问题?也许有3个表的模式就足够了,删除的问题应该在应用程序级别解决?

1 个答案:

答案 0 :(得分:1)

该数据库结构可能未标准化。处理这个问题虽然与直接级联删除无关,但可能会解决您的问题。

请注意,项目包含Person和Area的外键,而person包含Area本身。现在的问题是项目是否必须与给定人员的区域相关联。

如果必须与人的相同,那么结构是非标准化的 - 有关同一区域的信息包含在人员和项目记录中;有时它可能是出于优化目的而有意,但我怀疑这样一个小型数据库的情况。然后你可以自由地从项目中删除AreaID字段,甚至不需要考虑之间的直接级联删除,而是将其删除,以便一旦删除区域,其人员及其项目也将被删除。

如果可能是与此人无关的其他区域,则确实需要AreaID字段;这将创建两个删除路径:

  • 区域>>与Area>>相关联的人与人员相关的项目
  • 区域>>与Area
  • 相关的项目

现在,当有多个级联删除路径时,SQL服务器不喜欢(可能出于好的概念或技术原因,我目前还不能完全命名),所以你需要考虑你更喜欢哪个级联删除(和选择ON DELETE NO ACTION对其他人)。有三种可能性,最好由您决定:

  • 只有当没有项目与之直接关联时,才能删除区域;但是,您仍然可以删除所有区域的人员以及他们自己的项目
  • 只有当没有人与之直接关联时,才能删除区域;但是,如果只有项目与该区域相关联,则它们将与区域一起删除
  • 只有当没有人或项目与之关联时才能删除区域,期间;您必须先删除所有相关人员和项目

希望这能为你解决问题。 ^^

另请参阅:Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths