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