关系型数据库的1,2,3范式

本文图片转载于知乎,也是对知乎上文章的一个整理和总结,详细解释请看:

链接: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 解决了非主属性对于码的传递函数依赖 改善了删除异常和插入异常

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页