首页 文章

候选键有什么意义?

提问于
浏览
16

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

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

我见过如下记录的示例记录:

员工(ID,姓名,电话号码)

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

7 回答

  • 0

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

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

  • 3

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

    There can be more than one candidate key for a given row ,例如 EmployeeIDSSN .

    Often, rather than using a candidate key as the PK, a surrogate key is created instead. 这是因为关于使用哪个候选键的决定可能会在以后被发现是错误的,这可能会引起巨大的麻烦(字面上) .

    另一个原因是 a surrogate key can be created using an efficient data type 用于索引目的,候选键可能没有(例如, UserImage ) .

    第三个原因是 many ORMs work only with a single-column PK ,因此在这种情况下排除了由多个列(复合键)组成的候选键 .

    许多开发人员没有意识到的是 selecting a surrogate key over a natural key may be a compromise in terms of data integrity . 通过选择代理键,您可能会丢失对数据的一些约束,并且如果选择了代理键,通常需要触发器来模拟约束 .

  • 0

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

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

  • 4

    Candidate key 是在设计数据库系统时出现的概念 .

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

    User (fullName, socialSecurityNumber, creditCardNumber, age).
    

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

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

  • 13

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

  • 7

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

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

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

  • 0

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

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

    Account_No SocialSecurity_NO

相关问题