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

到目前为止的想法:

  • 创建具有连接到两个表的两个可为空外键字段的表。
    • 可能有一个触发器来拒绝插入和更新,这将导致其中 0 或 2 个为空。
  • 两个具有相同数据的独立表
    • 这打破了复制数据的规则。

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

有帮助吗?

解决方案

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

我通常推荐的:

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

在此设计中,您创建一个公共父表 D 那两个 AB 参考。这类似于面向对象设计中的常见超类型。现在你的孩子表 C 可以引用超级表,然后从那里您可以访问相应的子表。

通过约束和复合键,您可以确保给定的行 D 只能参考 A 或者 B 但不是两者兼而有之。

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top