我在维基上看到了关于3NF
https://en.wikipedia.org/wiki/Third_normal_form
这就是wiki给出的例子
Tournament Winners
Tournament Year Winner Winner Date of Birth
Indiana Invitational 1998 Al Fredrickson 21 July 1975
Cleveland Open 1999 Bob Albertson 28 September 1968
Des Moines Masters 1999 Al Fredrickson 21 July 1975
Indiana Invitational 1999 Chip Masterson 14 March 1977
上面说
the non-prime attribute Winner Date of Birth is transitively dependent on the candidate key {Tournament, Year} via the non-prime attribute Winner
我认为功能依赖是
for two row X1 , X2 if X1.col1 = X2.col1 and
X1.col2 = X2.col2, then col1 -> col2
我不明白获胜者的出生日期->获胜者(可能有人有相同的生日和相同的名字?)
获胜者可以->候选钥匙{锦标赛,年份}如果获胜者的名字是阿尔弗雷德里克森,可能是1998年印第安纳邀请赛或1999年得梅因大师赛)
那么,如何得出结论呢?
最佳答案
非正式地,“AA>”意味着左侧的一个值不能在右侧产生多个值,即使左侧存在于一行以上。1。
因此,在维基百科的例子中,有一个函数依赖项“cc>”,仅仅因为同一个优胜者即使在多行中存在时也不会有不同的出生日期(因为他/她赢得了多个锦标赛)。
因为…Winner -> Winner Date of Birth
(因为一个锦标赛不能有多个赢家)
和{Tournament, Year} -> Winner
(如上所述)
而不是Winner -> Winner Date of Birth
(因为一个人可以赢得多个比赛)
……然后functional dependency存在传递依赖。
我不明白获胜者的出生日期->获胜者(可能有人有相同的生日和相同的名字?)
你改变了方向。函数依赖不是“从”单个值,而是“朝”它。因此Winner -> {Tournament, Year}
,但不Winner -> Winner Date of Birth
。
顺便说一下,这个模型中不能有两个名字不同的人。一个更好的(更现实的)模型可能会使用一个代理密钥来识别人,允许重复的名字。
符合“函数”的数学概念。不管您“调用”一个函数多少次(即,有多少行包含f.d.左侧),它总是产生相同的“结果”(f.d.右侧)。如果它能产生多个结果,它就不是一个函数,而是一个“关系”。
关于database - Wiki示例中的3nf功能依赖项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16621446/