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

时间:2012-01-17 13:55:47

标签: sql-server-2008 database-design refactoring polymorphic-associations

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

this question中,马克做了很好的工作,展示了实施PA的三种常用方法。我想使用基表方法,它在同样出色的answer by Bill Karwin中有更详细的描述。

一个具体的例子如下:

enter image description here

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

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

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

选项1:

Option 1

每个实体都保留自己的主键,但也会获得备用密钥。

像:

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

踩:

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

选项2:

Option 2

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

像:

  • 现有实体未受影响。
  • 轻松找到评论的拥有实体。

踩:

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

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

1 个答案:

答案 0 :(得分:10)

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

相反,扩展现有的主键(每个实体),使用EntityType列(例如CHAR(1)),事件为E,人员为PD for Products)。

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

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

Polymorphic_Associations