【问题标题】:Superkey, candidate key & primary key超级键、候选键和主键
【发布时间】:2011-12-01 06:20:24
【问题描述】:

任何善良的灵魂可以通过下面的简单示例来澄清我的疑问并识别超级键、候选键和主键吗?

我知道有很多帖子和网站解释了它们之间的区别。但看起来都是通用定义。

例子:

Student (StudentNumber, FamilyName, Degree, Major, Grade, PhoneNumber)

所以从上面的例子中,我可以知道StudentNumber是一个主键。

但是对于超级键,我有点困惑,可以将哪些属性组合分组到超级键中?

至于候选键,我对给出的定义感到困惑,因为任何候选键都可以作为主键。

是不是说PhoneNumber等属性是候选键,可以是主键? (假设一个PhoneNumber只属于一个学生)

感谢您的澄清!

【问题讨论】:

  • 关系模型中,我们有主键和备用键,仅此而已。没有 superkeycandidate key 这样的东西。这些是使关系理论复杂化并因此破坏了关系理论的人的发明。

标签: sql oracle primary-key relational


【解决方案1】:

由于您不想要教科书的定义,因此松散地说,超级键是一组唯一定义行的列。

这个集合可以有一个或多个元素,一个表可以有多个超级键。你通常通过函数依赖来做到这一点。

在你的例子中,我假设:

StudentNumber    unique
FamilyName     not unique
Degree     not unique
Major      not unique
Grade      not unique
PhoneNumber    not unique

在这种情况下,超级键是包含学号的任意组合。

所以下面是超级键

StudentNumber
StudentNumber, FamilyName
StudentNumber, FamilyName, Degree
StudentNumber, FamilyName, Degree, Major
StudentNumber, FamilyName, Degree, Major, Grade
StudentNumber, FamilyName, Degree, Major, Grade, PhoneNumber
StudentNumber, Degree
StudentNumber, Degree, Major
StudentNumber, Degree, Major, Grade
StudentNumber, Degree, Major, Grade, PhoneNumber
StudentNumber, Major
StudentNumber, Major, Grade
StudentNumber, Major, Grade, PhoneNumber
StudentNumber, Grade
StudentNumber, Grade, PhoneNumber
StudentNumber, PhoneNumber

现在假设,如果 PhoneNumber 是唯一的(这些天谁共享电话),那么以下也是超级键(除了我上面列出的)。

PhoneNumber
PhoneNumber, Grade, 
PhoneNumber, Major, Grade
PhoneNumber, Degree, Major, Grade
PhoneNumber, FamilyName, Degree, Major, Grade
PhoneNumber, Major
PhoneNumber, Degree, Major
PhoneNumber, FamilyName, Degree, Major
PhoneNumber, StudentNumber, FamilyName, Degree, Major
PhoneNumber, Degree
PhoneNumber, FamilyName, Degree
PhoneNumber, StudentNumber, FamilyName, Degree
PhoneNumber, FamilyName
PhoneNumber, StudentNumber, FamilyName

候选键只是“最短”的超级键。回到第一个超级键列表(即电话号码不是唯一的),最短的超级键是 StudentNumber。

主键通常只是候选键。

【讨论】:

  • 一个问题,所以如果phonenumber是唯一的,它可以算作候选键吗?对于任何唯一的属性都可以算作候选键吗?谢谢
  • 是的,在这种情况下,有两个超级键仅由一个元素组成:{电话号码}和{学生号码},两者都可以是候选键。
  • A CK 不是“最”“最短”超级键。它是一个不包含更小的超级密钥的超级密钥。可以有不止一个。 CK 可以有不同数量的属性..
  • 所以,我们正在考虑将最小超键(即唯一)作为候选键,对吧?这是否意味着一张表不能有多个候选键@Cambium
  • 一张表可以有任意数量的 CK,并且最符合条件的 CK 被设为主键。候选键与主键非常相似。
【解决方案2】:

超键是任何属性集,其值对于表中所有可能的元组集始终是唯一的。

候选键是“最小”超键 - 表示唯一的超键属性的最小子集。因此,从候选键中删除任何属性都会使其不唯一。

主键只是一个候选键。主键和任何其他候选键之间没有区别。

仅根据属性名称列表对键进行假设并不是很有用。您需要知道属性之间应该包含哪些依赖关系。话虽如此,我的猜测是您是对的 - StudentNumber 可能是您示例中的候选键。

【讨论】:

    【解决方案3】:

    延伸 Cambium 的答案,如果 PhoneNumberStudentNumber 也是唯一的,那么 candidate keys 将是:- {StudentNumber},{PhoneNumber}
    这里我们不能假设{StudentNumber,PhoneNumber} 是一个单一的candidate key,因为如果我们省略一个属性,比如StudentNumber,我们仍然会得到一个唯一的属性{PhoneNumber},因此违反了candidate key 的定义。

    Primary key: 从所有candidate keys 中选择一个candidate key。有 2 个candidate keys,所以我们可以选择{StudentNumber} 作为primary key
    Alternate keys: 剩下的candidate keys,在从candidate keys 中选择primary key 之后,是备用键,即{PhoneNumber}

    compound key: 复合键是由两个或多个唯一标识实体出现的属性组成的键。简单键是只有一个属性的键。复合键可以由其他唯一的简单键和非键属性组成,但不能包含另一个复合键。

    composite key: 复合键至少包含一个复合键和一个属性。复合键还可以包括简单键和非键属性。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 2013-10-29
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2011-04-30
      • 2011-04-06
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多