1

我看了一下3NF https://en.wikipedia.org/wiki/Third_normal_form3NF在维基的例子函数依赖

维基这是维基给

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 

我cann OT明白生日 - 这得主日期>得奖者(有可能是人谁拥有相同的生日,同一个名字?) 和赢家可以 - >候选键{赛,年度}给出的获奖者铝弗雷德里克森,它可能是印第安纳邀请赛1998年或得梅因大师1999)

那么,它是如何跳到结论?

+0

问题的非关键依赖项是{Winner} - > {出生日期},而不是{出生日期} - > {Winner} – sqlvogel

+0

+1 to sqlvogel。那就对了。但是,我们怎么知道两个名叫Al Fredrickson的酒师都没有?在这种情况下,他们可能有不同的出生日期。使用这个名字作为这个人的代名词是一个不好的主意,它会使wiki条目变得更弱。 –

+0

除非您确实需要强制执行的FD清楚地列出,否则确切和此类示例总是没有意义。在现实中,你肯定不会把这个名字作为获胜者的标识符,但是在一个例子中,它可以比发明一些任意数字更简洁明了。 – sqlvogel

回答

1

非正式地,functional dependency意味着左侧的一个值不能在右侧产生多个值,即使左侧存在于多行中也是如此。

所以,在维基百科例如,有一个函数依赖Winner -> Winner Date of Birth,只是因为同样的获胜者不能有出生日期不同,即使他/她在多行存在(因为他/她多次获得比赛)。

由于...

  • {Tournament, Year} -> Winner(因为一个比赛不能有多个赢家)
  • Winner -> Winner Date of Birth(如上所述)
  • Winner -> {Tournament, Year}(因为一个人可以赢得多个赛事)

...然后by definition有一个传递性d ependency。

我无法理解有─即得主日期>得奖者(有可能是人谁拥有相同的生日,同一个名字?)

你翻转的方向。函数依赖不是“从”单个值,而是“向”它。因此Winner -> Winner Date of Birth,但是不是Winner Date of Birth -> Winner

顺便说一句,在这个模型中不能有两个不同名字的人。更好的(更现实的)模型可能会使用代理键来识别人员,从而允许重复名称。


这是符合 “功能” 的数学概念。无论你多少次“调用”一个函数(即多少行包含f.d.左侧),它总是产生相同的“结果”(f.d.右侧)。如果它能够产生多重结果,那它就不是一个函数,而是一个“关系”。

+0

谢谢你,这很清楚 –

1

据我所知:
对于任何{比赛,年份}你只有一个赢家。每个获胜者只有一个出生日期。维基声称,这可能导致漏洞:
假设你已经进入了一个新行:{“愚蠢比赛”,“2013”​​,“阿尔弗雷德里克森”,“2012年7月21”} - 您输入的出生日期不正确!
如果你把另一张表{WinnerID,WinnerBithday},你会阻止。

1

如果一个条目来与出生日期不同同的赢家?那么可能如何防止它们呢?

从基地

因为在表中每一行需要告诉我们谁在某一年赢得一个特定 邀请赛,复合键{赛,年度} 是最小的一组属性的保证唯一标识一行。即{比赛,年份}是表格的候选关键字。

如果关系R将添加具有不同出生日期的相同赢家名称,则它将为表格创建另一个唯一记录,但不应该这样做。我们需要独特的纪录,但是这表明两个不同的出生日期可以存在于同一个表中。

即使我们想复制的出生日期(获奖者),我们可以 另一个表拆分表,并且可以存储{赢家, 出生日期得主},以防止类似维基重叠显示。

参考

因为没有什么可从诞生之日不同的记录 不同的日期被显示停止同一个人。

这就是为什么它需要创建另一个表来防止重复。