如何在现有数据库中实现多态关联
对于相对简单的数据库要求来说,多态关系(PA)是相当满意的:让不同的表在一个共享表中有子logging。 经典的例子是一张带有评论logging的单表,适用于不同的不一定相亲的实体。
在这个问题上,马克做了很好的工作,展示了三种实现PA的常用方法。 我想要使用基表的方法,这在Bill Karwin的同样出色的答案中有更详细的描述。
一个具体的例子看起来像这样:
实体的主键在基表中引用相同的键值,并且注释表引用基表,因此观察到参照完整性。 这里的关键部分是实体表的主键具有不同的域。 它们是通过在基表中创build新logging并将生成的密钥复制到实体的主键来生成的。
现在我的问题是: 如果我想在现有的数据库中引入PA的参照完整性,那么这些数据库中将有实体产生自己的相互重叠的主键?
到目前为止,我看到两个select:
选项1:
每个实体保留自己的主键,但也得到一个备用的关键。
喜欢:
- 接近推荐的方法。
- 基表稳定。
不喜欢:
- 现有的实体必须修改。
- 很难find评论的拥有实体。
选项2:
每个实体在基表中都有自己的外键列。 这看起来像Mark的多列方法。
喜欢:
- 现有实体不受影响。
- 容易find评论的拥有实体。
不喜欢:
- 稀疏的列
- 基表不稳定:引入带有PA的新实体时需要修改
我倾向于选项1,可能与基本表中的字段“EntityName”进行双向查找。 哪个选项会更好。 或者是另一种更好的方法?
您可以使用选项1,但不需要额外的替代密钥。
相反,使用EntityType
列(比如CHAR(1)
,扩展现有的主键(每个实体的), E
(事件), P
(人), D
(产品))。
化合物(EntityId, EntityType)
将成为表Entity
的主键和其他3个子types表中的相应化合物。
( EntityType
只是一个辅助参考表,有3行):