【数据库】三范式
Pinkjun / 2020-11-01 / 软件技术 / 阅读量 331

第一范式

原子性:所有字段都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同属性。
下列是数据库的表符合第一范式:
符合第一范式
但是这个表不符合第一范式:
不符合第一范式

第二范式

第二范式就是在第一范式的基础上非主属性(非主键字段)完全依赖于主属性(主键)。
例:选课系表为
SelectCourse(学号、姓名、年龄、课程名称、成绩、学分)
主键为联合主键(学号、课程名称)

因为存在如下决定关系:
(学号、课程名称)→(姓名、年龄、成绩、学分)

在这个数据库表中,有某些依赖不满足第二范式的要求,因为存在着如下的关系:
(课程名称)→(学分) 部分依赖主键
(学号)→(姓名、年龄) 部分依赖主键
(学号、课程名称)→(成绩) 完全依赖主键

由于不符合2NF,这个选课关系会存在如下问题:
(1)数据冗余:同一门课程由n个学生选修,“学分”就重复n-1次,同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2)更新异常:如果调整了某门课程的学分,数据表中所有的“学分”值都要更新,否则会出现同一门课程学分不同的情况。
(3)插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于没有“学号”关键字,课程名称和学分也无法记录入数据库。
(4)删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

解决办法:将部分依赖的属性和这个被部分依赖的主属性从原表中分离,形成一个新表。上列的选课关系表应该拆分为3个表,拆分后的表就可以满足第二范式的要求,从而彻底消除了前面列出的问题,他们分别是:

学生表:Student(学号、姓名、年龄)
课程表:Course(课程名称、学分)
选课关系表:SelectCourse(学号、课程名称、成绩)

另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字,就不会存在部分依赖。

第三范式

在1NF基础上,任何非主属性不依赖于其他非主属性,即3NF就是在2NF基础上消除传递依赖,使得表中所有字段都直接依赖于主键字段。
第三范式(3NF)是第二范式的(2NF)的一个子集,即满足于第三范式(3NF)必须满足第二范式(2NF)。

所谓传递函数依赖,指的是如果存在“A→B→C”的决定关系,则C传递依赖于A。因此,满足第三范式的数据库应该不存在如下依赖关系:
(学号)→(姓名、年龄、所在学院、学院地点、学院电话)

这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号)→(所在学院)→(学院地点、学院电话)

即存在非关键字段“所在学院”、“学院电话”对关键字段“学号”的传递函数依赖,而不是直接依赖。它也会存在数据冗余、更新异常、插入异常和删除异常的情况,可自行分析得知。

解决办法:把学生表关系分成如下两个表:
学生:(学号、姓名、年龄、所在学院)
学院:(学院、地点、电话)

这样的数据库表示符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
1 + 1 =
快来做第一个评论的人吧~