如何处理 ERD(表)设计中的“或”关系?

Posted

技术标签:

【中文标题】如何处理 ERD(表)设计中的“或”关系?【英文标题】:How to handle an "OR" relationship in an ERD (table) design? 【发布时间】:2011-01-07 02:13:16 【问题描述】:

我正在为个人项目设计一个小型数据库,其中一个表,称为表C,需要有两个表之一的外键,分别称为AB,因输入而异。实现这一点的最佳方法是什么?

目前的想法:

使用连接到这两个表的两个可为空的外键字段创建表。 可能带有拒绝插入和更新的触发器,这会导致其中 0 或 2 个为空。 具有相同数据的两个单独的表 这违反了有关复制数据的规则。

解决这个问题的更优雅的方法是什么?

【问题讨论】:

添加了polymorphic-associations 标签,因为这是此类关系的常用术语。 【参考方案1】:

您正在描述一种称为多态关联的设计。这通常会给人们带来麻烦。

我通常推荐的:

A  -->  D  <--  B
        ^
        |
        C

在此设计中,您创建一个公共父表 DAB 都引用该表。这类似于 OO 设计中的常见超类型。现在您的子表C 可以引用超级表,然后您可以从那里访问相应的子表。

通过约束和复合键,您可以确保D 中的给定行只能被AB 引用,但不能同时被两者引用。

【讨论】:

【参考方案2】:

如果您确定 C 只会引用两个表中的一个(而不是 N 个表中的一个),那么您的第一选择是一种明智的方法(并且是我以前使用过的方法)。但是,如果您认为外键列的数量会不断增加,这表明可能存在一些相似或重叠,您可能需要重新考虑。

【讨论】:

以上是关于如何处理 ERD(表)设计中的“或”关系?的主要内容,如果未能解决你的问题,请参考以下文章

多时域设计中,如何处理信号跨时域

如何处理大维度表

如何处理Rails加入表关系删除?

我应该如何处理响应式设计中的 DOM 更改? [复制]

您如何处理模型类中的外键关系

如何处理数据仓库中的图关系?