1

我阅读了关于 3nf 的 wiki 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

我无法理解获胜者的出生日期->获胜者(可能有相同的生日和相同的名字?)并且获胜者可以 -> 候选键 {Tournament, Year} 给定获胜者的名字 Al Fredrickson,它可能是 1998 年印第安纳邀请赛或得梅因大师赛 1999)

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

4

3 回答 3

1

据我了解:
对于任何 {Tournament, Year},您只有一位获胜者。每位获奖者只有一个出生日期。Wiki 声称这可能会导致漏洞:
假设您输入了一个新行:{"Stupid Competition", "2013", "Al Fredrickson", "21 July 2012"} - 您输入了错误的出生日期!
如果您保留另一张表 {WinnerID, WinnerBithday},您将阻止这种情况。

于 2013-05-18T06:38:23.610 回答
1

如果一个参赛作品来自同一获奖者但出生日期不同怎么办?那么有可能如何防止它们呢?

从基地

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

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

即使我们想到重复出生日期(对于获胜者),我们也可以将该表拆分到另一个表中,并可以存储 {winner,winner date ofbirth} 以防止重复,如 wiki 所示。

参考

因为没有什么可以阻止同一个人在不同的记录上显示不同的出生日期。

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

于 2013-05-18T07:08:09.920 回答
1

通俗地说,函数依赖意味着左侧的一个值不能在右侧产生多个值,即使左侧存在不止一行。1

因此,在 Wikipedia 示例中,存在函数依赖关系Winner -> Winner Date of Birth,仅仅是因为同一个获胜者不能有不同的出生日期,即使他/她存在于多行中(因为他/她赢得了多个锦标赛)。

自从...

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

...然后根据定义,存在传递依赖。

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

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

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


1符合“函数”的数学概念。无论您“调用”一个函数多少次(即有多少行包含 fd 左侧),它总是产生相同的“结果”(fd 右侧)。如果它可以产生多个结果,它就不是一个函数,而是一个“关系”。

于 2013-05-18T11:28:50.973 回答