多态协商(PA)对于相对简单的数据库要求是相当满意的:让各个表在一个共享表中具有子记录.典型的例子是一个单独的表,其中包含注释记录,适用于不同的不同的实体.
在this question马克做了一个很好的工作,显示了实施PA的三种常见方法.我想使用基表方法,这在更加详细的描述在一个同样出色的answer by Bill Karwin.
一个具体的例子如下所示:
实体的主键指基基表中相同的键值,注释表指向基表,因此遵守参照完整性.这里的关键部分是实体表的主键具有不同的域.它们通过在基表中创建新记录并将其生成的密钥复制到实体的主键来生成.
现在我的问题是:如果我想在现有数据库中引用具有引用完整性的PA,如果实体生成自己的相互重叠的主键,该怎么办?
到目前为止,我看到两个选择:
选项1:
每个实体保留自己的主键,但也会获得一个备用键.
喜欢:
>接近推荐的方法.
>基表稳定.
不喜欢:
选项二:
每个实体在基表中都有自己的外键列.这看起来像马克的多列方法.
喜欢:
>现有实体不受影响.
>很容易找到拥有实体的评论.
不喜欢:
>稀疏列
>基表不稳定:引入具有PA的新实体时需要修改
我倾向于选项1,可能在基表中有一个字段“EntityName”用于双向查找.哪个选项会更好.还是另一个更好的方法?
解决方法
您可以使用选项1,但没有额外的代理替代键.
相反,使用EntityType列(如CHAR(1))扩展现有主键(对于事件为E,对于人员为D,对于产品为D).
化合物(EntityId,EntityType)将成为表实体的主键和其他3个子类型表中的相应化合物.
(EntityType只是一个辅助,参考表,有3行):