候选键的作用是什么?

18

我对数据库管理还比较新,但这个问题似乎从未得到过超过一句话的回答。其他所有SO答案都说“候选键是极小超键。” 对我来说这毫无意义。

一个候选键应该指定数据库记录的唯一性,对吧?而主键就是一个候选键。如果主键已经指定了唯一性,再加上更多的候选键有什么意义呢?

我见过像下面这样的示例记录:

Employee(ID, Name, PhoneNumber)

其中ID是主键,PhoneNumber是一个候选键。从我的理解来看,ID已足够指定员工记录的唯一性。虽然电话号码可能是唯一的,但将其作为候选键进行指定看起来并不“极小”。


请阅读Shuaib的详细回答: https://dev59.com/tXI-5IYBdhLWcg3wta7w - MakesReal
2
超键是唯一的列集。CK是不包含更小超键的超键。它是成为PK的候选项。PK只是您决定称之为PK的某些CK。其他CK是AK。SQL PK是UNIQUE NOT NULL,不一定是CK/PK。因此,我们可以说SQL CK是UNIQUE NOT NULL,是声明为SQL PK的候选项,并且我们可以将其他人称为SQL AK。在SQL上下文中,当人们使用这些具有RM和SQL中不同含义的术语时,您必须询问他们的意思。 - philipxy
9个回答

12

这意味着如果PhoneNumber确实是一个候选键,你可以删除ID列并使用PhoneNumber。换句话说,它是作为唯一键的候选键

维基百科有一个更加正式的定义,您可能会想要查看。


你是错的,从超级键中识别出许多候选项,然后从所有候选键中,程序员将选择一个主键,该主键用于标识给定关系的所有其他属性。在关系模型中使用主键和候选键是完全错误的概念。在这个例子中,电话号码不能成为候选键,因为人们可能有多个电话号码或家庭可能共享电话号码。 - Ubi.B

10
一个关键字被称为候选键,因为虽然它可以用作PK,但不一定是PK。
对于给定的行,可能会有多个候选键,例如EmployeeID和SSN。
通常,而不是使用候选键作为PK,而是创建替代键。这是因为以后可能会发现使用哪个候选键是错误的决定,这可能会带来巨大的麻烦(头疼)。
另一个原因是可以使用有效的数据类型创建替代键进行索引,而候选键可能没有(例如UserImage)。
第三个原因是许多ORM仅使用单列PK,因此在这种情况下排除由多个列组成的候选键(复合键)。
许多开发者没有意识到,在数据完整性方面,选择代理键而非自然键可能是一种妥协。通过选择代理键,您可能会失去对数据的某些约束,并且通常需要触发器来模拟约束(如果选择了代理键)。

1
只有在存在数据重复/缺乏规范化/更新异常的情况下,才需要执行您最后一段所述的操作。否则不需要执行。 - PerformanceDBA
如果您确定一组列确实是候选键,那么可以将UNIQUE约束条件应用于它 - 与PK无关。每个体面的RDBMS都有这个功能... - Fabricio Araujo
1
添加代理键会将其作为CK添加,但旧的CK在扩展表中仍然是CK。此外,您实际上并没有定义CK。 - philipxy

5
候选键是在设计数据库系统时出现的概念。
假设您的系统将有一张名为User的表,定义如下:
User (fullName, socialSecurityNumber, creditCardNumber, age).

好的,您需要选择这些列的哪个子集作为主键。

在设计数据库时,当然的目标是尽可能地将此集合保持最小化。如果仅使用SSN就可以保证唯一性,则不会使用(SSN, creditCardNumber)。

现在,假设fullName、SSN和creditCardNumber是您知道的所有用户都独一无二的字段。您可以使用其中任何一个作为您的PK,因此它们都是候选键(而age则不是)。
您会选择哪个呢?这将取决于诸如字段的数据类型(例如,在整数列上设置索引比在varchar列上更可取)等因素。


5

候选键与主键完全相同。所有候选键的目的都是为了通过防止重复数据来确保数据完整性。如果必要的话,可以在表中强制执行多个候选键,以确保某些数据不会重复。

请注意,在此上下文中,“最小”并不意味着最小。它意味着不可约。即使删除关键字中的任何属性也仍然保持其唯一性。


1
在关系模型中,超键是一组唯一的列。候选键(CK)是一个不包含更小超键的超键。它是成为主键(PK)的候选项。主键就是你决定称之为主键的某个候选键。其他候选键是备用键(AK)。
SQL主键是UNIQUE NOT NULL,不一定是CK/PK。因此,我们可以说SQL CK是UNIQUE NOT NULL,可以作为SQL PK声明的候选项,并且我们可以将其他CK称为SQL AK。在SQL上下文中,当人们使用这些具有RM和SQL中不同含义的术语时,您必须询问他们的意思。

1
我们使用候选键,因为有时需要关注记录和其他问题,例如银行系统的数据库,其中Account_No是主键,SocialSecurity_NO将是候选键,我们将SocialSecurity_NO保留为唯一键,因为如果政府在提供SocialSecurity_NO时出现错误,那么这将是一个大问题,因此我们已经将其声明为唯一键,因此不存在两个具有相同SocialSecurity_NO的用户可以进行账户操作...
主键-----------候选键---------属性3-------属性4
Account_No SocialSecurity_NO

0
简而言之:候选键是最小的超键。
在关系型数据库中,超键是用于唯一标识关系(表)中任何记录(元组)的列(或属性)组合。
例如,考虑一个具有列 A、B、C 和 D 的表中的以下依赖关系(仅提供此表作为快速示例,因此未涵盖 R 可能具有的所有依赖关系)。 属性集(决定因素)---可以识别--->(依赖项) A-----> AD
B-----> ABCD
C-----> CD
AC----->ACD
AB----->ABCD
ABC----->ABCD
BCD----->ABCD

现在,B、AB、ABC、BCD标识了所有列,因此这四个符合超键的条件。

但是,B⊂AB;B⊂ABC;B⊂BCD,因此AB、ABC和BCD不符合候选键的条件,因为它们的子集可以标识关系,所以它们不是最小的,因此只有B是候选键,而不是其他。

谢谢您的提问。


0
“候选键”与总统候选人一样,是指提供给您的选择,您必须从中选择一个。它们是主键的候选项。选择一个。实际上,并非所有的选择都一定同样好。

1
并不是真的,因为没有根本性的理由让你必须选择一个关键字而不是其他任何一个。拥有一个所谓的“主”关键字的想法本质上是一种任意选择,在原则上或实践中都没有太大的区别。 - nvogel
@dportas:嗯。当然,你可以在一个表上有多个键。但是你必须选择至多一个作为主键。至少,在我使用过的任何实际数据库引擎上都是如此。此外,我认为“主”这个词基本上意味着只有一个。 - Jay
1
我对你的总统类比并不满意。选择总统意味着特殊的功能和目的将唯一地适用于该选择。选择PK更像是从一群牛中选择一头优秀的公牛。你仍然有同样数量的公牛,它们的其他属性没有改变——所以选择零头、一头或多头作为“主要”的并不重要! - nvogel
@dportas:好吧,选定主键后,其他候选键仍然是键,只是它们中没有一个是“主键”。选定总统后,其他候选人往往会消失在默默无闻中。(快速问一下:你能说出超过2次选举失败的总统候选人的名字吗?)从这个意义上讲,这个比喻并不完美。 - Jay

0

候选键通常指那些可能被选为自然主键的列。然而,自然主键通常不是一个好主意,因为它们是唯一的但不是不变的(想想如果公司名称更改了,就需要更改数百万个子行的混乱情况),或者因为它们在连接方面比代理键效率低。此外,在现实生活中,许多潜在的候选键并不稳定到足以成为真正的主键,并且并不像我们想象的那样独特。例如,电子邮件可以在关闭帐户后重新使用。

您可以添加其他索引来指定唯一性以维护数据完整性。例如,在您的示例中,您正在使用代理键来确保记录的唯一性。但这并不能确保人员/电话组合仅输入一次。因此,如果您使用代理键,则需要为数据中的任何可能的候选键(这可以由一个或多个字段组成)创建唯一索引。这确保了需要唯一的项目,并允许您获得代理键的性能优势。

有时候,某些字段或字段组合应该是唯一的。例如,假设您有一个存储组织结构的表。每个组织实体都应该是唯一的,每个组织/人员组合也应该是唯一的(假设没有工作共享)。通过在这些字段上放置唯一索引,您可以防止将错误数据插入表中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接