消除 ER 模型中的循环

Eliminating cycles in ER model

我正在尝试设计一个数据库作为练习题来学习 ER 模型。简单来说,我有三个实体:UserPostComment。我在 UserPost 之间存在一对多关系(用户可以发布 posts),在 UserComment 之间存在一对多关系(一个用户可以写很多评论)和 PostComment 之间的一对多关系(一个 post 可以包含很多评论)。显然,这形成了一个循环,我被告知在设计时要避免循环。那么有什么巧妙的方法可以简化这些关系来消除循环呢?或者也许有一个通用算法,可以说,消除循环?

只有当始终相同的两个实体通过多于一条路径连接时,才会出现需要避免的有问题的循环。例如,如果一个员工为一个部门工作,一个部门位于一个城市,并且您还有一个关系表明某个员工在哪个城市工作。但是如果你有一个关系说Employee住在哪个城市,这可能和他工作的城市不同,那么,即使它形成一个循环,你也不能在不丢失信息的情况下消除它。

同理,在你的模型中没有什么可以消除的,除非你想丢失一些基本信息,因为用户和评论之间的关系表达了​​某个用户写了某个评论的事实,这可能是一个对另一个用户的 Post 发表评论。

Obviously, this forms a cycle, and I've been told to avoid cycles when designing.

不知道ERD图不能有"cycles"的想法从何而来。我花了数年时间做这种工作——我们有一个 E 尺寸的绘图仪​​,并在门上贴了一张图表——直到我在 SO 上听说它之前,我从未遇到过无循环规则。

真正的规则与页面上的图片无关;它与数据库中的行有关。

想象一下员工的组织结构图 table。大多数员工都有老板,每个老板都是员工。因此,员工与员工之间存在一种关系:一个循环。除了它不是循环。它在页面上看起来像一个,因为员工 table 代表所有员工。它看起来不像数据库中的一个,因为每个员工都是不同的。如果您将所有老板员工 映射为索引卡和地板上的纱线,您会看到一棵树。

我想无循环规则的出现是为了防止冗余关系,如 Why should I avoid loops when designing relationships for a database? 中所述,但数据库设计不能简化为这样的简单规则。规范化是去除 all 冗余的过程,而不仅仅是那些具有某些图形特征的冗余。如果可以用表面规则来检查,它可以由机器来完成。您所要做的就是将列名称倒在顶部,然后弹出您的数据库设计。

所以实际规则是,不要绘制可推导的关系。画出表达约束所必需的最小集合,仅此而已。就像米开朗基罗和大理石块(据说):把不是大卫的所有东西都削掉,然后你就完成了。