【问题标题】:Can a table have a surrogate key without a (natural) alternate key?一个表可以有一个没有(自然)备用键的代理键吗?
【发布时间】:2016-11-21 05:44:12
【问题描述】:

我认为没有(自然)备用键的表具有代理键是没有意义的(请记住,代理键的属性之一是它在数据库之外没有意义环境)。

例如说我有下表:

假设employee_id 是代理主键,并且表中没有(自然)备用键。

现在假设某个员工想要更改他的电话号码,我们如何识别该员工在表格中的记录?我们无法使用代理键识别它,因为代理键在现实世界中是未知的(即我们不知道每个员工的employee_id)。

因此,表中必须有一个(自然)备用键来识别现实世界中的每个员工(例如:SSN)。

我是对的,还是我遗漏了什么?

【问题讨论】:

  • 但在此设计中,我们希望员工 ID 被称为旧业务流程或新业务流程的一部分,而与数据库无关,因此 自然键。 (请参阅我更新的答案“代理”和“自然”。)

标签: database database-design relational-database


【解决方案1】:

你是对的。通常,数据库的用户需要能够将数据库表中的信息映射到数据库之外的真实概念或事物。为此,他们需要一个可用的自然键 - 或者可以可靠地转换为自然键的东西。

您的具体示例不一定是一个好的示例,因为许多(大多数?)组织在员工任职期间为员工分配了一个员工标识符。雇员和雇主都可以知道该雇员标识符并将其用作自然键。您在示例中说过 employee_id 是代理项,但根据它的名称,许多人可能会认为它不是。

【讨论】:

    【解决方案2】:

    每个表都有一个候选键。 (可能是所有列。)该键的每个值都指定 something。如果没有在外部使用employee_ids,它们和其他三列的集合都将标识具有相同姓名、地址和电话号码的人员集合

    您说得对,表必须包含您要识别的任何实体的自然键——“自然键”的意思是“在当前业务规则下,数据库外部的指示符”。


    您似乎混淆了“代理键”和“自然键”的多个含义。

    对于“代理”:一种用途是,根据当前业务规则确定指定的属性集:代理为新的。另一种用途是,一个属性集,其中指定根据当前业务规则确定并且仅在内部使用:代理作为内部。

    对于“自然”:一种用途是,在当前业务规则和之前下指定的属性集:自然和旧一样。另一种用途是,在当前业务规则下指定的属性集:natural as external。

    “代理”的原始用法与“自然”一样是内部的。不幸的是,现在人们通常使用“替代”作为新的和“自然”作为旧的。而且他们很少考虑或区分代理是内部的。有些人可能将新引入的外部指示符称为代理(作为新的)和自然的(作为外部的)。 (Re "meaningless" names.)

    您所能做的就是破译或询问某人在使用这些术语时的含义。

    请注意,这些定义与“当前”业务规则相关。您似乎还假设员工 ID 随数据库一起到达。在某些时候它们被引入,所以在一些旧系统启动后被选择,所以在新系统下代理是新的。但是,如果数据库来得较晚,那么到那时它们就是旧的自然键了。两次都是自然的外在;当引入它们时,它们只是自然地作为外部的。

    【讨论】:

    • 我会说,“每张格式良好的桌子”。我无法告诉你我已经修复了多少个没有声明主键的数据库,以及在哪里有重复的行,从而产生了神秘的结果。
    【解决方案3】:

    术语“自然键”属于主题或问题领域,而不属于数据库设计或解决方案领域。

    如果您询问组织中的人员如何称呼对方,通常是按名称。 “那是玛丽琼斯,一个人坐着”。你永远不会听到,“那是员工 79932,一个人坐着。”

    如果您像我们大多数人一样询问数据库人员,使用该名称有什么问题,您会得到标准答案:它不是唯一的。它是可变的。字数太多了所有这些都是真实的,但这并不会改变人们在现实世界中的工作方式。

    “社会安全号码”这个项目最初是作为一个人工钥匙出现的,尽管那是在计算机革命真正开始之前(1938 年)。随着时间的推移,它已经呈现出自然键的大部分外观和感觉。在你的情况下,我什至会称它为自然键,因为每个员工都有一个(除非有一些做作的东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2014-01-11
      • 2012-10-31
      • 1970-01-01
      • 2016-05-12
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多