我经常看到人们在关系数据库中使用artifical / surrogate键。考虑到这一点,在我看来,虽然这简化了连接查询,但它使新元组的插入变得复杂。请看以下示例:
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主键集的值)我引用是已知的。
我的假设是正确的还是我错过了什么?
答案 0 :(得分:2)
您是正确的,通常需要额外的工作来处理代理键。您可以利用某些库代码或框架来帮助您进行代理键处理,但在复杂性和处理时间方面总是存在成本。类似的考虑适用于查询和插入。广泛使用代理键总是意味着您的查询平均会进行更多连接。
每当您认为需要代理密钥时,您应该根据任何潜在的好处评估这些成本。不要过度使用代理人。在许多情况下,也可能是大多数情况下,没有充分的理由在数据库表中使用代理键。