表的规范化(BCNF)

时间:2013-12-03 14:49:23

标签: database relational-database database-normalization

我正在尝试理解如何规范化数据库,我们老师给出的练习之一就是在BCNF中对此表进行规范化:

Flight(**CityDeparture,CityArrival,Day**,NationDeparture,NationArrival)

其中(CityDeparture,CityArrival,Day)是主键。 所以我认为:

1)城市名称独立于国家(不可能有两个国家拥有相同的城市,即使实际上不是这样),否则主键就错了。

2)功能依赖性是     CityDeparture-> NationDeparture     CityArrival-> NationArrival 这意味着表格甚至没有在2NF中,所以我将其分解为:     飞行(的 CityDeparture,CityArrival,日) 没有非平庸的FD,所以它在BNCF,对吗?

CityD(**CityDeparture**,NationDeparture) CityDeparture->NationDeparture

在BNCF,因为CityDeparture是关键

CityA(**CityArrival**,NationArrival) CityArrival->NationArrival

在BNCF,因为CityArrival是关键。

我还考虑过CityA和CityD可能完全相同,除非每个城市都有不同的出发/到达代码(例如,如果航班从那里出发,NewYork的代码为'AAA',如果航班停在那里则代码'BBB' )所以可以只有一个城市(名称,国家)表,CityDeparture,CityArrival都会引用它。

分解也应该是无损的,因为 City.Name 是两个表的公共属性,并且是City的关键(我对此非常不确定)

当我向老师展示时,它只得了0,并告诉我去看书而不做进一步的解释。现在我读过这本书,我找到的文章在这里链接,但我老实无知,所以我要求你的建议!任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

  

1)城市名称独立于国家(不可能有两个国家拥有相同的城市,即使实际上不是这样),否则主键就错了。

一方面,你的推理是正确的。另一方面,许多(大多数?)教科书规范化练习根本不包括密钥。您通常希望从依赖项派生所有可能的键。也许你的老师希望你忽略现有的密钥。

另一种可能性是你的老师希望你包括FD {CityDeparture,CityArrival,Day} - > {NationDeparture,NationArrival}。

另一种可能性是您的老师希望您在主键中探索中的依赖项。是否有任何多值依赖?

如果你的书中包含了一个可以用铅笔和纸做的算法 - 大多数都是这样 - 试着用这种方式进行处理。看看你得到了什么。

答案 1 :(得分:0)

你的分解

Flight(CityDeparture,CityArrival,Day,NationDeparture,NationArrival)

进入

Flight(CityDeparture,CityArrival,Day) 
CityD(CityDeparture,NationDeparture)
CityA(CityArrival,NationArrival)

确实给了你BCNF。

关于最后一步,CityD和CityA的统一:这不是你的功能依赖所证明的,因此从正式的数据库角度看是不正确的。通过进一步的背景知识可以证明这一点。在实践中,它在大多数情况下都是有意义的。

请记住,数据库规范化是一种正式的规则,其算法也是如此。用你的关系替换人工名称,例如R(A,B,C,D,E)具有相同的键和功能依赖性 - 结果必须相同才能重命名。

修改 这假定主键和两个功能依赖关系CityDeparture-> NationDeparture和CityArrival-> NationArrival作为练习的一部分给出 - 否则请参阅Mike的答案。