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

Ger*_*old 13 refactoring database-design polymorphic-associations sql-server-2008

多态协会(PA)对于相对简单的数据库要求非常满意:让各种表在一个共享表中具有子记录.经典示例是具有注释记录的单个表,其适用于不同的不一定类似的实体.

这个问题中, Mark做了很好的工作,展示了实现PA的三种常用方法.我想使用基表方法,Bill Karwin在同样优秀的答案中对此进行了更详细的描述.

一个具体的例子如下:

在此输入图像描述

实体的主键引用基表中的相同键值,而注释表引用基表,因此可以观察到引用完整性.这里的关键部分是实体表的主键具有不同的域.它们是通过在基表中创建新记录并将其生成的密钥复制到实体的主键来生成的.

现在我的问题是:如果我想在具有生成自己的,相互重叠的主键的实体的现有数据库中引入具有引用完整性的PA,该怎么办?

到目前为止,我看到两个选项:

选项1:

选项1

每个实体都保留自己的主键,但也获得备用键.

喜欢:

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

不喜欢:

  • 必须修改现有实体.
  • 很难找到评论的拥有实体.

选项2:

选项2

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

喜欢:

  • 现有实体未受影响.
  • 很容易找到评论的拥有实体.

不喜欢:

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

我倾向于选项1,可能在Base表中使用字段"EntityName"进行双向查找.哪个选项会更好.或者是另一种甚至更好的方法?

ype*_*eᵀᴹ 9

您可以使用选项1但不使用其他代理替代密钥.

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

(EntityId, EntityType)然后该化合物将成为表的主键Entity和其他3个子类型表中的相应化合物.

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

Polymorphic_Associations