如何处理ERD(表)设计中的“OR”关系?
-
21-09-2019 - |
题
我正在为个人项目设计一个小型数据库,其中一个表,称为表 C
, ,需要有两个表之一的外键,调用它们 A
和 B
, ,因条目而异。实现这一点的最佳方法是什么?
到目前为止的想法:
- 创建具有连接到两个表的两个可为空外键字段的表。
- 可能有一个触发器来拒绝插入和更新,这将导致其中 0 或 2 个为空。
- 两个具有相同数据的独立表
- 这打破了复制数据的规则。
解决这个问题的更优雅的方法是什么?
解决方案
您正在描述一种称为多态关联的设计。这常常会给人们带来麻烦。
我通常推荐的:
A --> D <-- B
^
|
C
在此设计中,您创建一个公共父表 D
那两个 A
和 B
参考。这类似于面向对象设计中的常见超类型。现在你的孩子表 C
可以引用超级表,然后从那里您可以访问相应的子表。
通过约束和复合键,您可以确保给定的行 D
只能参考 A
或者 B
但不是两者兼而有之。
其他提示
如果你确定 C
只会引用两个表中的一个(而不是 N 个表中的一个),那么您的第一选择是一种明智的方法(也是我之前使用过的方法)。但是,如果您认为外键列的数量将继续增加,这表明可以合并一些相似或重叠的内容,您可能需要重新考虑。
不隶属于 StackOverflow