【问题标题】:When a primary key is considered to be a natural key and when it is considered to be a surrogate key?什么时候主键被认为是自然键,什么时候被认为是代理键?
【发布时间】:2016-11-19 16:39:59
【问题描述】:

我试图了解何时将主键视为自然键以及何时将其视为代理键。我读过代理键和自然键具有以下属性:

自然键是由已经存在的属性组成的键 在现实世界中。

代理键在数据库环境之外没有意义。

假设我有下表(employee_id 是主键):

现在假设employee_id在现实世界中是已知的,例如:每个员工都有一张身份证,上面印有employee_id,这是否意味着employee_id是一个自然密钥?

现在让我们考虑另一种情况,employee_id 在现实世界中是未知的(它在数据库环境之外没有任何意义),而员工在现实世界中使用他们的SSN 来识别,这是否意味着employee_id 是代理键?

【问题讨论】:

  • 您引用的“自然键”定义很常见,但许多人会使用没有“已经”的定义;那么即使外部可见的 id 在数据库中是新的,它们仍然是自然的。使用您的“已经”定义的人可能会使用与您给出的不同的“代理”定义,将其定义为“新的”而不是“内部的”,并且会称新员工 ID 不是自然的而是替代的。

标签: database database-design relational-database


【解决方案1】:

你的总结是正确的。所有键都是它们识别的事物的“代理”。与数据库管理相关的唯一有用区别是关键属性是否存在或是否打算用于业务领域(AKA 话语领域)。如果在业务域中使用密钥,则将其称为自然密钥(也称为业务密钥或域密钥)。否则称为代理键。

然而,这些术语有些非正式,并且确实被不同的人以微妙不同的方式使用。

E.F.Codd 在他的 RM/T 论文中使用了更严格的代理定义。他提出了一个甚至在数据库表中都不可见的“键”的想法。他的提议存在一些严重的问题,并且没有按照他描述的方式广泛实施。它主要只具有历史意义。

Codd 定义中仍然相关的一个方面是,代理通常不应该是可见的——至少对于业务领域中的数据用户来说是不可见的。在业务域中公开键值实际上使键成为域键而不是代理项。由此可见,代理键不履行域密钥的角色或消除对域密钥的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多