用 DBMS 中的例子解释 3NF
当一个关系在2NF中并且没有传递依赖关系时,一个关系在3NF中,或者一个关系在3NF中,当它在2NF中并且所有非键属性直接依赖于候选键时。
示例
考虑一个关系学生(rollno,game,feestructure)
F − {rollno -> game, rollno -> feestructure, game -> fee} Rollno+= {rollno, game, feestructure} => rollno is primary key
上面的student表是1NF,因为没有多值属性。
学生表也在2NF中,因为所有非键属性都完全依赖于主键(rollno)。但是该表不在3NF中,因为存在传递依赖,即游戏->费用结构。
费用结构通过游戏对rollno具有传递/间接依赖性。
异常
上面的学生表也存在所有三个异常-
插入异常-除非我们让学生玩该游戏,否则无法将新游戏插入到表中。
删除异常-如果从表中删除rollno7,我们也会丢失有关网球的完整信息。
更新异常-为了改变篮球的费用结构,我们需要在不止一个地方做出改变。
因此,现在要将上述学生表首先转换为3NF,我们需要将表分解如下-
分解为3NF
为了克服这些异常,应将学生表分成更小的表。
如果X->Y是传递依赖,则将R分为R1(X+)和R2(RY+)。
游戏->费用结构是一个传递依赖[因为游戏既不是键也不是费用是键属性]
R1=游戏+=(游戏,费用结构)
R2=(student-feestructure+)=(rollno,game)
所以把student表分成R1(game,feestructure)和R2(rollno,game)。
R1
R2
以上两个表都没有所有三个异常。