12

对于相对简单的数据库需求来说,多态关系(PA)非常满意:让各种表在一个共享表中有子记录。典型的例子是一张带有评论记录的单表,适用于不同的不一定相亲的实体。如何在现有数据库中实现多态关联

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

的具体例子将如下所示:

enter image description here

实体的主键指的是相同的密钥值在基地台和评论表指的是基台,所以参照完整性被观察到。这里的关键部分是实体表的主键具有不同的域。它们是通过在基表中创建新记录并将其生成的密钥复制到实体的主键来生成的。

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

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

选项1:

Option 1

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

像:

  • 关闭到推荐的方法。
  • 基表稳定。

不喜欢:

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

选项2:

Option 2

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

像:

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

不喜欢:

  • 稀疏列
  • 基表不能稳定下来:需要时推出了具有PA新的实体修改

我瘦到选项1,可能与现场基表中的“EntityName”用于双向查找。 哪个选项会更好。或者是另一种更好的方法?

+0

选项1会更容易维护。如果你必须不断添加列到你的基表中,它会变得很麻烦,并且由于页面拆分和指针等原因而需要大量的维护。 – JNK 2012-01-17 14:05:58

+0

@JNK好的一点是,物理存储的影响很重要。 – 2012-01-17 14:43:12

+0

您可以使用选项1,但不能使用额外的替代密钥。新的备用密钥可以是每个实体的现有主密钥,用一个“EntityType”列(例如'CHAR(1)'扩展,事件可以是'E',人员''P',对于产品) – 2012-02-21 13:47:16

回答

9

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

相反,扩展现有的主键(每个实体),与EntityType列(比如CHAR(1),这将是E事件,P起诉,D的产品)。

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

(该EntityType仅仅是一个辅助的,参考表,以3行):

Polymorphic_Associations