候选键有什么意义?

时间:2010-10-18 17:01:57

标签: database database-design entity-relationship relational-database

我对数据库管理还很陌生,这个问题似乎永远不会在一个以上的句子中回答。所有其他SO答案都说“候选键是最小的超级键”。这对我来说毫无意义。

候选键应该指定db记录的唯一性,对吗?主键是候选键。如果主键已经指定了唯一性,那么添加更多候选键有什么意义呢?

我见过以下示例记录:

员工(身份证,姓名,电话号码)

其中ID是主键,PhoneNumber是候选键。从我看到的,ID足以指定员工记录的唯一性。虽然PhoneNumbers(可能)是唯一的,但将它们指定为候选键对我来说似乎并不“最小”。

9 个答案:

答案 0 :(得分:12)

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

维基百科有更多formal definition,你很多人都想看。

答案 1 :(得分:7)

密钥称为候选密钥,因为虽然它可以用作PK,但它不一定是PK。

给定行可以有多个候选键,例如EmployeeIDSSN

通常情况下,不是使用候选键作为PK,而是创建surrogate key这是因为稍后可以发现围绕使用哪个候选键的决定是错误的,这会导致巨大的头痛(字面意思)。

另一个原因是,可以使用有效数据类型来创建代理键以用于索引目的,候选键可能没有(例如,UserImage)。

第三个原因是许多ORMs仅适用于单列PK ,因此在这种情况下排除了由多个列(复合键)组成的候选键。

许多开发人员没有意识到的是,natural key上选择代理密钥可能会在数据完整性方面做出妥协。通过选择代理键,您可能会丢失对数据的一些约束,如果选择了代理键,通常需要触发器来模拟约束。

答案 2 :(得分:4)

候选键意味着与主键完全相同。所有候选键都有相同的用途:通过防止重复数据来确保数据完整性。如果有必要确保某些数据不重复,那么表格中有多个候选键是强制执行的。

请注意,此上下文中的最小值并不意味着最小。这意味着不可减少。即,在保持其唯一性的同时,不能从密钥中删除任何属性。

答案 3 :(得分:3)

候选键是在设计数据库系统时出现的概念。

假设您的系统将有一个名为User的表,定义如下:

User (fullName, socialSecurityNumber, creditCardNumber, age).

那么,您必须选择这些列的哪个子集作为主键。 当然,设计数据库时的目标是保持最小化。您 如果仅SSN已经保证唯一性,则不会使用该对(SSN,creditCardNumber)。

现在,假设 fullName,SSN和creditCardNumber 都是您知道的所有字段,不知何故, 这对所有用户都是唯一的。你可以使用其中任何一个作为你的PK,所以他们是 所有候选人密钥(而另一方面,年龄不是)。
你会选择哪个? 这将取决于诸如字段的数据类型之类的因素(它更可取 例如,在整数列而不是varchar列上设置索引。

答案 4 :(得分:1)

在RM(关系模型)中:超键是唯一的列集。 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中使用这些具有不同含义的术语时的含义。

答案 5 :(得分:0)

“候选人钥匙”是与候选人完全相同的候选人:总统候选人是候选人:他们是向您呈现的选择,您必须从中选择一个。他们是主键的候选人。选一个。在实践中,并非所有选择都必然同样好。

答案 6 :(得分:0)

候选键通常指那些可能被选为自然主键的列。然而,自然主键通常也是一个坏主意,因为它们是唯一的但不是不变的(想想由于公司名称改变而导致改变数百万个子行的破坏),或者因为它们的连接效率低于代理键。此外,在现实生活中,许多潜在的候选键对于真正的PK来说不够稳定,并且不像我们想象的那么独特。例如,帐户关闭后可以重复使用电子邮件。

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

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

答案 7 :(得分:0)

我们使用候选键,因为有时需要处理记录和其他问题,例如银行系统的数据库,其中Account_No是主键,SocialSecurity_NO将是候选键,我们将SocialSecurity_NO保持为UNIQUE键,因为如果政府在提供SocialSecurity_NO时出错,那么这将是一个大问题,所以我们已经将它声明为UNIQUE键,因此具有相同SocialSecurity_NO的两个用户不可能有帐户...

主键-----------候选键--------- attribute3 ------- attribute4

Account_No SocialSecurity_NO

答案 8 :(得分:0)

简而言之:CANDIDATE KEY是最小的SUPER KEY。

超级键是唯一标识RDBMS中关系(表)中任何记录(或元组)的列(或属性)的组合。


例如,在具有A,B,C和D列的表中考虑以下依赖关系(仅为快速示例提供此表,因此不涵盖R可能具有的所有依赖关系)。

属性集(行列式) ---可以识别---> (从属)

A -----> AD

B -----> ABCD

C -----> CD

AC -----> ACD

AB -----> ABCD

ABC -----> ABCD

BCD -----> ABCD


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

但是,⊂AB; B⊂ABC; B⊂BCD因此AB,ABC和BCD不符合候选键的资格,因为它们的子集可以识别这种关系,因此它们不是最小的,因此只有B是候选键,而其他不是。

感谢提问。