在数据库中建模循环 1:N 关系

Modeling cyclic 1:N relations in database

是否可以将以下 ER 图建模为 SQL 数据库表,尤其是因为循环 1:N 关系:

这是一个完全正常的设计。

吃(宠物,食物)
讨厌(人,食物)
拥有(人,宠物)

随心所欲地分配 Es、Rs 和 1:Ms。

没有必要担心您碰巧注意到的某些模式,尤其是当您没有经验时。了解如何应用您的信息建模方法以及如何使用图表方法表达其设计。

这是一个罕见的设计,但它是可能的。

一个例子:你的数据库包含网站。每个网站都有聘请的作者撰写要在该网站上发布的文章。但是这些网站是互相加好友的,每个网站都link在他们的主页上推荐了另一个网站的文章。

  • E3 = 网站(website_id,域,recommended_article_id)
  • E1 = 作者 (author_id, author_name, website_id)
  • E2 = 文章(article_id,文本,author_id)

问题是如何填写table。您可能希望外键是强制性的,即必须将文章分配给作者,而作者本身必须与网站相关联,而该网站又必须具有 linked 文章。不先添加作者就不能添加文章,没有网站就没有作者,没有文章就没有网站——经典的先有鸡还是先有蛋的因果关系困境。

解决方案是/或...

  • ... 使其中一列可以为空。例如。您可以插入没有 linked 文章的网站(即 website.article_id 可以为空)。然后在添加作者和文章后更新网站 table 行并设置 linked 文章。
  • ...使用延迟约束,如果 DBMS 具有它们的话。这意味着您完全插入所有行(网站、作者和文章),并且在插入时不检查外键的一致性(没问题,因此网站引用的文章不在文章 table 中时网站被插入)。然后,只有在提交数据时,才会检查外键,并且所需的一切都到位。

通常采用第一种方法,因为我们很少真正希望所有关系都是强制性的。在给定的示例中,我们可以从一个没有任何 linked 文章的网站开始。只有稍后我们添加另一个网站时,我们才能为两个网站中的每一个添加交叉文章link。