5

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

到目前为止的想法:

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

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

4

2 回答 2

11

您正在描述一种称为多态关联的设计。这常常使人们陷入困境。

我通常推荐的:

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

在此设计中,您创建一个共同的父表DA引用B。这类似于 OO 设计中的常见超类型。现在您的子表C可以引用超级表,并且您可以从那里访问相应的子表。

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

于 2010-01-20T01:31:08.063 回答
1

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

于 2010-01-20T01:27:22.877 回答