设计范式是符合某一级别的关系模式的集合。构造数据库必须遵循一定的规则,在关系数据库中,这种规则就叫范式。
目前关系数据库有六种范式,一般来说,数据库满足到第三种范式就行了。
关系数据中几种范式介绍:
1. 第一方式(1NF)
在任何关系数据库中,第一范式(1NF)就是对关系模式的基本要求,不满足1NF的数据库就是不是关系数据库。
定义:数据库中的字段是单一属性,不可再分。这个单一属性由基本类型构成,包括:整型、实数、字符型、逻辑型、日期型等等、
例如:如下的数据库是符合第一范式的:
字段1 字段2 字段3 字段4
而这样的数据库是不符合第一范式的:
字段1 字段2 字段3 字段4
字段3.1 字段3.2
很显然,在当前的关系数据库中不可能做出不符合第一范式的数据库。
2. 第二范式(2NF)
定义:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖是指存在组合关键字段中某些字段决定非关键字段的情况),即所有的非关键字段完全依赖任意一组候选关键字段。
假定选课关系表SelectCourse(学号、姓名、年龄、课程名称、成绩、分数),关键字为组合关键字(学号、课程名称),因此存在如下决定关系:
(学号、课程名称)------>(姓名、年龄、成绩、分数)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称)->(学分)
(学号)->(姓名、年龄)
即存在组合关键字的字段决定非关键字的情况。
由于不符合第二范式,这个选课关系表会存在如下问题:
(1).数据冗余
同一课程由N个学生选修,“学分”就会重复N-1次;同一学生选修了N门课程,姓名和年龄就会重复N-1;
(2).更新异常
若要调整某门课程的学分,则数据库表的所有行的“学分”都要更新,否则出现同一门课程“学分”不同的情况。
(3).插入异常
若新增一门新的课程,由于没人选修,这样,由于没有“学号”关键字,课程名称和学分也无法记录入数据库。
(4).删除异常
假如一些学生已完成了选修课程,这时就应该从数据库表中删除。但是,如果真的删除的话,课程名称和学分信息也会被删除了。
把选课关系表SelectCourse改为如下三张表:
学生:Student(学号、姓名、年龄)
课程:Course(课程名称、学分)
选课关系:SelectCourse(学号、课程名称、成绩)
这样的数据库表就符合第二范式,消除了数据冗余、更新异常、插入异常、删除异常。
3. 第三范式(3NF)
定义:数据表中非关键字段不存在对任一候选关键字段的传递依赖。
所谓的传递依赖是值,如果存在“A->B->C”的决定关系,则C传递依赖于A。因此,满足第三范式的数据表应该不存在如下的依赖关系:
关键字段->非关键字段x->非关键字段y
假定学生关系表为Student(学号、姓名、年龄、所在学院、学院地址、学院电话),关键字段为单一字段“学号”,因为存在如下决定关系:
(学号)->(姓名、年龄、所在学院、学院地址、学院电话)
这是符合第二范式的,但是不符合第三范式,因为存在如下决定关系:
(学号)->(所在学院)->(学院地址,学院电话)
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况。
把学生关系表拆分如下:
学生:(学号、姓名、年龄、所在学院)
学院:(学院、地址、电话)