l 第一范式(1NF):(字段不可再分)数据库表中的字段都是单一属性的,不可再分。
原表1
应修改成如下:
修改后的表
l 第二范式(2NF):(消除部分函数依赖)在满足第一范式的基础上,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。(另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。)
原表2
学分完全依赖课程名称;姓名、年龄完全依赖学号;成绩依赖学号和课程
这样的后果是:
(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4)删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
修改后如下:
学生表
课程表
成绩表
l第三范式(3NF):(消除传递函数依赖)在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。也就是说表中的字段和主键直接对应不依靠其他的中间字段。
原表3
可以看出表中的学院地点依赖于学院,学院依赖于学号,学院电话同理。所以这不符合第三范式,这样的结果同样会造成上述不良后果
(1) 数据冗余:同一个“学院”由n个学生,“学院地点”和“学院电话”就重复n-1次。
(2) 更新异常:若调整了某学院的地点,数据表中所有有关行的“学院地点”值都要更新,否则会出现同一学院但是地点却不同的情况。
(3) 插入异常:假设要增加一个新学院,暂时还没有人报考。这样,由于还没有“学号”关键字,相关数据将无法记录入数据库。
(4) 删除异常:假设一批学生已经毕业,这些学生信息记录就应该从数据库表中删除。但是,与此同时,学院、学院地点和学院电话信息也被删除了。很显然,这也会导致插入异常。
修改后如下:
学生表
学院表
结束语:通过运用三个范式可以使你的数据库更加准确、高效。但是在关系数据库中,还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求,那些我们以后再谈。