这些约束如何可能导致循环或多个级联路径?

How can these constraints may cause cycles or multiple cascade paths?

注意:这个问题更多是关于数据库设计和 SQL 服务器,而不是像 EF Core 这样的特定 ORMDB。

我有一个如下所示的数据库架构:

使用 EF Core 迁移,所有 SQL 语句都可以 运行 直到最后一个约束 (FK_BookReleases_Nicknames_NicknameId)。可以添加之前的FKFK_BookReleases_Books_BookId

我收到的错误是(关于 SO 的许多其他文章):

Introducing FOREIGN KEY constraint 'FK_BookReleases_Nicknames_NicknameId' on table 'BookReleases' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我的问题是,该设计的缺陷在哪里?我无法理解这种情况发生在任何逻辑下。什么是正确的解决方法?我看到许多建议更改 ON DELETE 操作,但没有具体说明我应该使用哪个 FK 以及其他什么操作。

更糟糕的是,即使已经阅读 this article 我仍然不明白这怎么可能是个问题,以及他提出的解决方案如何适合上述模式。

问题是由于从作者(祖父)到 BookRelease(孙子)的多个级联路径。有两个级联路径:

  1. 作者 -> 书籍 -> BookRelease
  2. 作者 -> 昵称 -> BookRelease

这在 post in MSSQLTips

中有详细讨论

所以,处理方法是:

  1. 禁用 ON DELETE CASCAE 并选择 NOACTION 作为外键创建。

  2. 在 Author(GrandParent)、Book(Child1)、Nickname(Child2) 表中创建 INSTEAD OF DELETE TRIGGERS 来处理子表中父键的删除。

  • Grand Parent deletion : Delete in GrandChild, followed by Child1, followed by Child2,
  • Child1 deletion: Delete in GrandChild, followed by Child1
  • Child2 deletion: Delete in GrandChild, followed by Child2