2

我经常看到人们在关系数据库中使用人工/代理键。想一想,在我看来,虽然这简化了连接查询,但它使新元组的插入变得复杂。举个例子:

R1(a, b, c) R2(c, d, e) c 是 R2 的代理主键,由 R1(c) 引用。如果要在R1和R2中插入数据,首先要检查R2中是否已经存在要插入的R2元组,如果存在,则必须获取其对应的人工密钥,以便在元组中引用它对于 R1。

使用自然键: R1(a,b,d,e) R2(d,e) 属性 d 和 e 是 R2 的自然主键集,由 R1(d,e) 引用。如果我想在 R1 和 R2 中插入一个新元组,我可以简单地插入它们,因为对于 R1 元组,我引用的外键(即 R2 主键集的值)是已知的。

我的假设是正确的还是我遗漏了什么?

4

1 回答 1

2

您是正确的,通常需要额外的工作来处理代理键。您也许可以利用一些库代码或框架来帮助您进行代理键处理,但在复杂性和处理时间方面总是要付出代价。类似的考虑适用于查询和插入。广泛使用代理键总是意味着您的查询平均会进行更多的连接。

每次您认为需要代理键时,都应根据任何潜在收益评估这些成本。不要过度使用代理。在许多情况下,可能是大多数情况下,没有充分的理由在数据库表中使用代理键。

于 2015-05-24T12:16:47.973 回答