【问题标题】:Surrogate Keys complicate insertion?代理键使插入复杂化?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多