本文图片转载于知乎,也是对知乎上文章的一个整理和总结,详细解释请看:
链接:https://www.zhihu.com/question/24696366/answer/29189700
A——>B 表示A函数决定B
Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。
不符合范式,主要产生以下四种异常:
1.冗余数据
2. 修改异常 修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
3.删除异常 删除一个信息,那么也会丢失其它信息。例如如果删除了 课程-1,需要删除第一行和第三行,那么 学生-1 的信息 就会丢失。
4.插入异常 例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
为了解决上述问题,提出了范式这一概念:
范式是某一种级别的关系模式的集合,表示一个关系内部个属性之间的联系的合理化程度。
1范式的每个属性不可再分。
修改为:
符合1范式:
存在的问题:
数据冗余过大
插入异常 : 无法将系名与系主任的数据单独地添加到数据表中去
删除异常 : 假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了
修改异常 : 李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据。
提高设计标准。需要第二范式,2范式在1范式的基础之上,消除了非主属性对于码的部分函数依赖。
传递函数依赖:例子——系主任依赖于系名,系名包含于学号,学号不函数依赖于系名,那么系主任传递函数依赖于学号。
转换步骤:
第一步:找出数据表中所有的码。
第二步:根据第一步所得到的码,找出所有的主属性。
第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
第四步:查看是否存在非主属性对码的部分函数依赖。
可以看到,数据冗余减少了。修改异常也改进了。但是插入异常和删除异常仍然存在。
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖
插入异常和删除异常都有改进。
总结一下:
1NF 属性不可再分
2NF 解决了非主属性对于码的部分函数依赖 改善了数据冗余和修改异常
3NF 解决了非主属性对于码的传递函数依赖 改善了删除异常和插入异常