JLe*_*ner 33 sql oracle relational primary-key
任何善良的灵魂都可以通过下面的一个简单示例澄清我的疑惑,并确定超级钥匙,候选钥匙和主键?
我知道有很多帖子和网站在那里解释它们之间的差异.但看起来所有都是通用定义.
例:
Student (StudentNumber, FamilyName, Degree, Major, Grade, PhoneNumber)
Run Code Online (Sandbox Code Playgroud)
所以从上面的例子中,我可以知道StudentNumber是一个主键.
但至于超级密钥,我有点困惑,哪些属性组合可以分组到超级密钥?
至于候选键,我对给定的定义感到困惑,因为任何候选键都可以作为主键.
这是否意味着诸如PhoneNumber候选键之类的属性可以成为主键?(假设一个人PhoneNumber只属于一个学生)
谢谢你的任何澄清!
Cam*_*ium 54
由于您不想要教科书定义,松散地说,超级键是一组唯一定义行的列.
该集合可以包含一个或多个元素,并且表格可以有多个超级密钥.您通常通过功能依赖来实现此目的.
在你的例子中,我假设:
StudentNumber unique
FamilyName not unique
Degree not unique
Major not unique
Grade not unique
PhoneNumber not unique
Run Code Online (Sandbox Code Playgroud)
在这种情况下,超级密钥是包含学号的任何组合.
所以以下是超级密钥
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
Run Code Online (Sandbox Code Playgroud)
现在假设,如果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
Run Code Online (Sandbox Code Playgroud)
候选键只是"最短"的超级键.回到第一个超级密钥列表(即电话号码不是唯一的),最短的超级密钥是StudentNumber.
主键通常只是候选键.
nvo*_*gel 13
超级键是任何属性集,对于这些属性,值始终保证对于表中所有可能的元组集都是唯一的.
候选键是"最小"超级键 - 表示唯一的超键属性的最小子集.因此,从候选键中删除任何属性将使其不唯一.
主键只是候选键.主键和任何其他候选键之间没有区别.
仅根据属性名称列表对密钥进行假设并不是真正有用.您需要知道属性之间应该包含哪些依赖项.话虽如此,我的猜测是你是对的 - 在你的例子中,StudentNumber可能是候选键.