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