Database design 代理键使插入复杂化?

Database design 代理键使插入复杂化?,database-design,foreign-keys,key,relational-database,surrogate-key,Database Design,Foreign Keys,Key,Relational Database,Surrogate Key,我经常看到人们在关系数据库中使用人工/代理键。仔细想想,在我看来,虽然这简化了连接查询,但却使插入新元组变得复杂。以以下为例: 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(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)会失去导航(关系)能力。这将导致更多的连接(连接更少的神话是错误的)。原因是,代理违反了关系模型中的访问路径独立规则。