如何在现有数据库中实现多态关联

对于相对简单的数据库要求来说,多态关系(PA)是相当满意的:让不同的表在一个共享表中有子logging。 经典的例子是一张带有评论logging的单表,适用于不同的不一定相亲的实体。

在这个问题上,马克做了很好的工作,展示了三种实现PA的常用方法。 我想要使​​用基表的方法,这在Bill Karwin的同样出色的答案中有更详细的描述。

一个具体的例子看起来像这样:

在这里输入图像描述

实体的主键在基表中引用相同的键值,并且注释表引用基表,因此观察到参照完整性。 这里的关键部分是实体表的主键具有不同的域。 它们是通过在基表中创build新logging并将生成的密钥复制到实体的主键来生成的。

现在我的问题是: 如果我想在现有的数据库中引入PA的参照完整性,那么这些数据库中将有实体产生自己的相互重叠的主键?

到目前为止,我看到两个select:

选项1:

选项1

每个实体保留自己的主键,但也得到一个备用的关键。

喜欢:

  • 接近推荐的方法。
  • 基表稳定。

不喜欢:

  • 现有的实体必须修改。
  • 很难find评论的拥有实体。

选项2:

选项2

每个实体在基表中都有自己的外键列。 这看起来像Mark的多列方法。

喜欢:

  • 现有实体不受影响。
  • 容易find评论的拥有实体。

不喜欢:

  • 稀疏的列
  • 基表不稳定:引入带有PA的新实体时需要修改

我倾向于选项1,可能与基本表中的字段“EntityName”进行双向查找。 哪个选项会更好。 或者是另一种更好的方法?

您可以使用选项1,但不需要额外的替代密钥。

相反,使用EntityType列(比如CHAR(1) ,扩展现有的主键(每个实体的), E (事件), P (人), D (产品))。

化合物(EntityId, EntityType)将成为表Entity的主键和其他3个子types表中的相应化合物。

EntityType只是一个辅助参考表,有3行):

Polymorphic_Associations