我正在为个人项目设计一个小型数据库,其中一个表称为 table C
,需要有两个表之一的外键,称为A
和B
,不同的条目。实现这一点的最佳方法是什么?
到目前为止的想法:
- 使用连接到这两个表的两个可为空的外键字段创建表。
- 可能有一个触发器来拒绝插入和更新,这将导致其中 0 或 2 个为空。
- 具有相同数据的两个单独的表
- 这打破了关于复制数据的规则。
解决这个问题的更优雅的方法是什么?
我正在为个人项目设计一个小型数据库,其中一个表称为 table C
,需要有两个表之一的外键,称为A
和B
,不同的条目。实现这一点的最佳方法是什么?
到目前为止的想法:
解决这个问题的更优雅的方法是什么?
您正在描述一种称为多态关联的设计。这常常使人们陷入困境。
我通常推荐的:
A --> D <-- B
^
|
C
在此设计中,您创建一个共同的父表D
并A
引用B
。这类似于 OO 设计中的常见超类型。现在您的子表C
可以引用超级表,并且您可以从那里访问相应的子表。
通过约束和复合键,您可以确保给定的行D
只能被A
或B
不能同时被引用。
如果您确定它C
只会引用两个表中的一个(而不是 N 中的一个),那么您的第一选择是一种明智的方法(并且是我以前使用过的方法)。但是,如果您认为外键列的数量会不断增加,这表明可能存在一些相似性或重叠,您可能需要重新考虑。