如何处理 ERD(表)设计中的“或”关系?
Posted
技术标签:
【中文标题】如何处理 ERD(表)设计中的“或”关系?【英文标题】:How to handle an "OR" relationship in an ERD (table) design? 【发布时间】:2011-01-07 02:13:16 【问题描述】:我正在为个人项目设计一个小型数据库,其中一个表,称为表C
,需要有两个表之一的外键,分别称为A
和B
,因输入而异。实现这一点的最佳方法是什么?
目前的想法:
使用连接到这两个表的两个可为空的外键字段创建表。 可能带有拒绝插入和更新的触发器,这会导致其中 0 或 2 个为空。 具有相同数据的两个单独的表 这违反了有关复制数据的规则。解决这个问题的更优雅的方法是什么?
【问题讨论】:
添加了polymorphic-associations
标签,因为这是此类关系的常用术语。
【参考方案1】:
您正在描述一种称为多态关联的设计。这通常会给人们带来麻烦。
我通常推荐的:
A --> D <-- B
^
|
C
在此设计中,您创建一个公共父表 D
,A
和 B
都引用该表。这类似于 OO 设计中的常见超类型。现在您的子表C
可以引用超级表,然后您可以从那里访问相应的子表。
通过约束和复合键,您可以确保D
中的给定行只能被A
或B
引用,但不能同时被两者引用。
【讨论】:
【参考方案2】:如果您确定 C
只会引用两个表中的一个(而不是 N 个表中的一个),那么您的第一选择是一种明智的方法(并且是我以前使用过的方法)。但是,如果您认为外键列的数量会不断增加,这表明可能存在一些相似或重叠,您可能需要重新考虑。
【讨论】:
以上是关于如何处理 ERD(表)设计中的“或”关系?的主要内容,如果未能解决你的问题,请参考以下文章