为啥在为数据库设计关系时应该避免循环?

Posted

技术标签:

【中文标题】为啥在为数据库设计关系时应该避免循环?【英文标题】:Why should I avoid loops when designing relationships for a database?为什么在为数据库设计关系时应该避免循环? 【发布时间】:2011-12-28 06:45:23 【问题描述】:

有人告诉我,在数据模型中有循环是糟糕的设计。我之前听说过几次,但没有太在意。例如,您有实体用户、项目、活动。项目归用户所有,因此我们在用户和项目之间存在一对多的关系。一个活动可以分配给一个用户,另一个从用户到活动的一对多关系。当然,一个项目是由一组活动定义的,另一种从项目到活动的一对多关系。这样就形成了一个循环。

我问这个人为什么它的设计不好,但他告诉我他也不知道,他也被告知,猴子学习是最好的。

我尝试搜索,但我想我没有使用正确的词,但在我看来,这对于尝试设计数据库的人来说应该是基本的。

那么,谁能给我指出一些关于 er/db 图中的循环/循环的有用信息,应该避免它们吗?

【问题讨论】:

【参考方案1】:

this paper (archive.org) 的第 3 章对关系循环有很好的处理。

一般来说,循环最常见的问题是冗余信息的一致性。

考虑父母有很多孩子的情况(来自论文);每个孩子都上一所学校。父母与学校之间存在第三种关系(“父母在学校有孩子”)。但是:您不想明确地为第三关系建模;它完全可以从其他两个推导出来。如果您确实明确捕获它,则需要确保循环始终保持一致。

所以在这种情况下,您需要避免循环。然而:循环并不是普遍的坏事。再次以上面的例子为例,考虑对父母是学校州长的情况进行建模。这也会创建一个循环。在这种情况下,尽管它是有效的:不可能从其他两个关系中推导出“父母是学校的州长”关系。

总而言之:当一种关系完全可以从其他关系的组合中推导出来时,不要对循环进行建模。但是当它们不可推导时创建循环是可以的。

我会推荐这篇论文;它给出的描述比我在这里给出的要好得多。

【讨论】:

这是一个很好的问题,你的回答很有意义。因此,如果我要推断 OP 的示例,您可以说您通常不需要将用户链接到项目,因为可以根据他们被分配给任务的事实得出这种关系,而这些任务又被分配给项目,因此您可以推导出这种关系。但是,如果您的项目实体有项目经理,这将是映射到用户的有效关系,因为您无法派生该关系。 @Stephen:是的,就是这样。这篇论文也有一些其他的场景——但本质上它归结为要么管理冗余信息的一致性,要么通过推导将其删除。 这篇论文似乎无事生非。不,“循环”(这种)不是“更好地避免”。最好避免的是冗余(通常,不仅适用于关系)。可以从已经存在的其他信息中推导出的信息,除非您有充分的理由不这样做,否则应避免使用。为什么他们需要 x-ty pages 来说明这个? @Erwin:如果你已经知道在循环中应该注意什么——正如你清楚地知道的那样——那么这篇论文不会告诉你任何新的东西。然而,OP 明确表示,他被告知“循环不好”并且不知道为什么。本文提供了具体的例子,从第一原则解释这种情况。因此,如果您从那里开始,这是合适的。如果你不是,那就不是。 链接已失效。

以上是关于为啥在为数据库设计关系时应该避免循环?的主要内容,如果未能解决你的问题,请参考以下文章

设计基于服务器的访问数据库时的标准步骤是啥?

使用循环引用设计关系数据库

微服务设计原则

数据库 为功能学校设计一个简单的数据库

类设计时如何避免ORM情况?

数据库分库分表如何避免“过度设计”和“过早优化”