表格是否可以没有(自然)备用密钥的代理键?

时间:2016-11-21 05:44:12

标签: database database-design relational-database

我认为,如果没有(自然的)备用密钥,那么拥有代理密钥的表是没有意义的(请记住,代理密钥的一个属性是它在外面没有任何意义数据库环境)。

例如说我有下表:

enter image description here

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

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

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

我是对的,还是我错过了什么?

3 个答案:

答案 0 :(得分:1)

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

您的具体示例不一定是好的,因为许多(大多数?)组织在其工作期间为员工分配员工标识符。该员工标识符可以是已知的,并且由雇员和雇主用作自然密钥。您已经说过您的示例中的employee_id是代理,但根据其名称,许多人可能认为它不是。

答案 1 :(得分:0)

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

你是对的,一个表必须包含你要识别的任何实体的自然键 - 对于"自然键"含义"当前业务规则下的指示符,在数据库外部"。

你好像混淆了#34;代理键的多重含义"和"自然键"。

对于"代理":一种用途是,一个属性集,其中指定自当前业务规则以来的指定:代理为新的。另一个用途是,一个属性集,其中的名称由当前业务规则确定,并且仅在内部使用:代理作为内部。

对于"自然":一种用途是,在当前业务规则之前和之前指定的属性集:自然为旧。另一个用途是,根据当前业务规则指定的属性集:自然为外部。

原来使用"代理"与#34;自然"作为外部的。不幸的是现在通常人们使用"代理"作为新的"自然"老了。他们很少将代理人视为内部人。有些人可能会将新引入的外部指示符称为代理(如新)和自然(作为外部)。 (Re "meaningless" names.

你所能做的只是解密或询问当有人使用这些条款时的含义。

请注意,这些定义相对于" current"业务规则。您似乎也假设员工ID与数据库一起到达。在某些时候它们被引入,所以在一些较旧的系统启动后被选中,因此在新系统下代理是新的。但是如果数据库来得晚些时候那么它们就像旧的那样是自然键。两次都是外在的自然;在介绍时,他们只是 new 自然的外部。

答案 2 :(得分:0)

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

如果您询问组织中的人们如何互相引用,通常是按名称。 “那是玛丽琼斯,独自坐着”。你永远不会听到,“那是员工79932,独自坐着。”

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

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