|
有没有好心的人可以通过以下简单的例子澄清我的问题,确定超键、候选键和主键?# J; {% q5 G/ ]3 t1 U7 _; l
我知道有很多帖子和网站解释了它们之间的区别。但看起来所有都是通用定义。
6 E+ n \% R }# x. Q5 l例子:
6 U* h1 J% l3 ^, q* zStudent (StudentNumber,FamilyName,Degree,Major,Grade,PhoneNumber)所以我可以从上面的例子中知道StudentNumber是主键。
& Q' _# R. I8 t: _# g/ P9 B. m但是对于超级键,我有点困惑。哪些属性组合可以分组成超级键?) R; z% w7 o2 C' H# _! D H) t" a
至于候选密钥,我对给出的定义感到困惑,因为任何候选密钥都可以用作主密钥。
* L. f" M( O2 q6 N1 J这是否意味着像这样的属性?PhoneNumber是候选键,可以是主键(假设一个人PhoneNumber只属学生)$ f+ q0 p U9 N* L/ i
感谢您的澄清!
+ q" B8 m E) `/ S+ R2 B! W( z, g & M+ H) G8 t, @
解决方案:
3 a5 h& W/ P, v" u. | 综上所述,超级键是一组唯一的定义列,因为你不需要教科书的定义。9 z( [, ]$ `- c" z: D' x
集合可以有一个或多个元素,一个表可以有多个超级键。通常,您可以通过功能依赖来完成此操作。9 t/ j; n2 `7 y
在你的例子中,我假设:
1 z8 l" f' }, ]StudentNumber uniqueFamilyName not uniqueDegree not uniqueMajor not uniqueGrade not uniquePhoneNumber not unique在这种情况下,超级键是包含学生编号的任何组合。7 g: k, ^9 P- u8 t. |( Z
所以下面是超级键3 c" c- F/ M0 r; L/ s! {2 s) V7 S
StudentNumberStudentNumber,FamilyNameStudentNumber,FamilyName,DegreeStudentNumber,FamilyName,Degree,MajorStudentNumber,FamilyName,Degree,Major,GradeStudentNumber,FamilyName,Degree,Major,Grade,PhoneNumberStudentNumber,DegreeStudentNumber,Degree,MajorStudentNumber,Degree,Major,GradeStudentNumber,Degree,Major,Grade,PhoneNumberStudentNumber,MajorStudentNumber,Major,GradeStudentNumber,Major,Grade,PhoneNumberStudentNumber,GradeStudentNumber,Grade,PhoneNumberStudentNumber,PhoneNumber假设,如果PhoneNumber是唯一的(这几天谁分享电话),所以下面也是超级键(除了上面列出的内容)。
8 |, e* o. X0 a$ w$ D6 OPhoneNumberPhoneNumber,Grade,PhoneNumber,Major,GradePhoneNumber,Degree,Major,GradePhoneNumber,FamilyName,Degree,Major,GradePhoneNumber,MajorPhoneNumber,Degree,MajorPhoneNumber,FamilyName,Degree,MajorPhoneNumber,StudentNumber,FamilyName,Degree,MajorPhoneNumber,DegreePhoneNumber,FamilyName,DegreePhoneNumber,StudentNumber,FamilyName,DegreePhoneNumber,FamilyNamePhoneNumber,StudentNumber,FamilyName候选键只是最短的超键。回到超级键的第一个列表(即电话号码不是唯一的),最短的超级键是StudentNumber。# {, ]' j- a( f% X
主键通常只是候选键。 |
|