3n在wiki的例子中的功能依赖

时间:2013-05-18 06:32:56

标签: database database-design relational-database third-normal-form

我读了关于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

我无法理解获胜者的出生日期 - >获胜者(可能有人有相同的生日和同名?) 获胜者可以 - >候选钥匙{锦标赛,年份}获得冠军名称Al Fredrickson,可能是印第安纳州邀请赛1998或Des Moines Masters 1999)

那么,它是如何得出结论的呢?

3 个答案:

答案 0 :(得分:1)

据我了解:
对于任何{Tournament,Year},您只有一名获胜者。每位获奖者只有一个出生日期。 Wiki声称这可能导致漏洞:
假设您已进入新行:{“Stupid tournament”,“2013”​​,“Al Fredrickson”,“2012年7月21日”} - 您输入了错误的出生日期!
如果您保留另一个表{WinnerID,WinnerBithday},您将阻止它。

答案 1 :(得分:1)

如果出现具有不同出生日期的同一获奖者,该怎么办?那么如何防止它们呢?

从基地

  

因为表格中的每一行都需要告诉我们谁赢了特定的   特定年份的比赛,复合键{锦标赛,年}   是保证唯一标识行的最小属性集。也就是说,{Tournament,Year}是该表的候选键。

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

  

即使我们考虑到出生日期的重复(对于获奖者),我们也可以   将该表拆分为另一个表,并可以存储{赢家,赢家的日期   出生}以防止重复,如维基所示。

参考

  

因为没有什么能阻止同一个人出现   不同记录的不同出生日期。

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

答案 2 :(得分:1)

非正式地,functional dependency表示左侧的一个值不能在右侧产生多个值,即使左侧存在多个行。 1

因此,在维基百科的例子中,存在功能依赖Winner -> Winner Date of Birth,因为即使他/她存在多行(因为他/她赢得了多个锦标赛),同一个胜利者也不能有不同的出生日期。

...由于

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

...然后by definition存在传递依赖。

  

我无法理解获胜者的出生日期 - >获奖者(可能有人有相同的生日和同名?)

你翻转了方向。功能依赖不是“来自”单个值,而是“朝向”它。因此Winner -> Winner Date of Birth,但 Winner Date of Birth -> Winner

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


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