【发布时间】:2015-05-23 19:34:51
【问题描述】:
我经常看到人们在关系数据库中使用人工/代理键。想一想,在我看来,虽然这简化了连接查询,但它使新元组的插入变得复杂。举个例子:
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 主键集的值)是已知的。
我的假设是正确的还是我遗漏了什么?
【问题讨论】:
-
(a) 你是对的。还有更多:(b)使用代理你会失去关系完整性,(c)你会失去导航(关系)能力。这个结果是更多的连接(更少连接的神话是错误的)。原因是,代理违反了 Relational Model 中的 Access Path Independence 规则。
标签: database-design foreign-keys key relational-database surrogate-key