Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环或多重级联删除_C#_Sql_Architecture_Database Schema - Fatal编程技术网

C# 循环或多重级联删除

C# 循环或多重级联删除,c#,sql,architecture,database-schema,C#,Sql,Architecture,Database Schema,我的结构如下: 每个人都有具体的区域 每个项目都有具体的区域,每个项目都有具体的人员 并非所有字段都可为空(一个且仅一个关系) 标准的“现场”情况,业务逻辑是正确的。DB也是正确的,工作正常。但当我为这些关系中的每一个添加级联删除时,我当然会得到错误: 'Persons' table - Unable to create relationship 'FK_Persons_Areas'. Introducing FOREIGN KEY constraint 'FK_Persons_Are

我的结构如下:

  • 每个人都有具体的区域
  • 每个项目都有具体的区域,每个项目都有具体的人员
  • 并非所有字段都可为空(一个且仅一个关系)
标准的“现场”情况,业务逻辑是正确的。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.
我理解这件事发生的原因。例如,如果删除区域,则应删除所有具有此区域ID的项目,并删除每个具有此区域ID的人员,然后删除所有具有已删除人员的项目。。。 如何解决这个问题?我试图再添加一个名为ProjectAreas的表:

但这并不能解决问题。而且,不清楚项目只有一个领域


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

数据库结构可能不规范。处理这个问题,虽然与级联删除没有直接关系,但可能会解决您的问题

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

如果必须与人员的相同,则结构不规范-关于相同区域的信息包含在人员和项目记录中;有时出于优化的目的,这可能是有意的,但我怀疑对于这样一个小的数据库来说情况是否如此。然后你可以自由地从项目中删除AARID字段,不需要考虑直接级联删除,而是这样,一旦删除区域,它的人和他们的项目也被删除。 如果它可能是与此人无关的其他区域,则区域ID字段确实是必需的;这将创建两个删除路径:

  • 区域>>与区域关联的人员>>与人员关联的项目
  • 区域>>与区域关联的项目
现在,SQL server不喜欢存在多个级联删除路径(可能是出于概念上或技术上的原因,我现在还不能完全命名),因此您需要考虑您更喜欢哪一个级联删除(并选择ON DELETE NoAction ON the others)。有三种可能性,最好由您决定:

  • 区域只有在没有项目直接关联时才能删除;但是,您仍然可以删除所有区域的人员以及他们自己的项目
  • 区域只有在没有人直接关联时才能删除;但是,如果只有项目与该区域关联,则它们将与该区域一起删除
  • 区域只有在没有人员或项目与其关联时才能删除,期间;必须先删除所有相关人员和项目
希望这能帮你解决问题^^

另见: