2NF以上的范式都是对关系上的依赖进行限制,其中最重要的是3NF和BCNF。
- BCNF:所有非平凡依赖都以超键为决定子。一个属性集只有包含了整个的键,才能决定集外的属性。
- 3NF:其非平凡依赖X->A必须满足:X是超键,或者A是主属性。3NF比BCNF有所放松,允许含键不完全的属性集决定集外的属性,但必须是主属性。
- 不符合3NF的情况有两种:
- 键的真子集决定非主属性,即非主属性对键的部分依赖;
- 既非超键也非键的真子集决定非主属性,由此将可证明,存在非主属性对键的传递依赖。
如果一个关系不满足2但满足1,称此关系符合2NF。
2NF和3NF的涵义是:键是关系的标识信息,非主属性是附属信息。如果附属信息对标识信息的依赖不够紧密,关系的语义单纯性就差,从而容易出现各种更新异常。
如果违反2NF,既存在非主属性对键的部分依赖,会有什么问题?例如关系模式SCGT(S#,C#,G,TN),S#是学生号,C#是课程号,G是成绩,TN是任课教师姓名,假设每门课只有一个教师。(S#,C#)是键,C#->TN是非主属性对键的部分依赖,因为它的存在会产生三种更新异常:1). 不开课的教师姓名无法插入;2). 一门课的所有学生都退选,则任课教师姓名无法保留;3). 一门课更换教师时,必须对选该课的所有学生进行修改。非主属性对键的部分依赖反映了附属信息和标识信息的缺乏整体一致性,所以会产生以上问题。
如果符合2NF,但违反3NF,即存在非主属性对键的传递依赖,会有什么问题?例如关系模式SDL(S#,DEPT,LOC),S#是学生号,DEPT是所在系,LOC是系的办公地,这里S#是键,S#->DEPT,DEPT-/>S#,DEPT->LOC,LOC传递依赖于S#,因为它的存在会产生三种更新异常:1). 如果一个系新成立尚未招生,则无法插入;2). 如果一个系不再招生,但仍为其他系开课,则现有学生毕业后,系的信息无法保留;3). 一个系更换办公地时,必须对该系的所有学生进行修改。非主属性对键的传递依赖反映了附属信息和标识信息缺乏直接一致性,所以会产生以上问题。缺乏直接一致不如缺乏整体一致那样严重,所以到了3NF才排除。
那么BCNF的涵义在哪里呢?
2NF和3NF对一个关系模式中的非主属性加以限制,而忽略键之间的关系。如果一个主属性依赖含键不完全的属性组意味着什么呢?可以证明,该依赖涉及不止一个键,其决定子有两种情况,一种是部分键,一种是含部分键和键外的属性。第一种情况下存在一个键之外的属性对该键的部分依赖;第二种情况下,取一个不含前述主属性的键,易知存在该属性对该键的传递依赖,即一个键外的属性对该键的传递依赖,排除这两种情况就得到BCNF。为什么要这样做呢?因为有多个键的情况下,必须照顾每一个键,如果键之外的属性和该键不能保持整体和直接的一致,也可能产生更新异常。例如SCZ(S,C,Z),S,C,Z分别表示街道,城市,邮编,关系模式上的依赖集为{SC->Z,Z->C},SC和SZ都是键。如果插入一个城市的总邮编,必须借助一个街道,删除这个街道,城市的总邮编也被删除,出现这种情况是因为C与SZ键缺乏整体一致性。
参考:
王能斌《数据库系统教程》/电子工业出版社