第一范式
1. 数据库中的所有字段都具有单一属性
2.单一属性的列是由基本数据类型所构成的
3.设计出来的表是简单的二维表
第二范式 : 在满足第一范式的基础之上满足以下条件
要求一张表中值具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列只对部分主键的依赖关系。
非主键列只对部分主键有依赖关系,这种情况只出现在复合主键的表中,也说是所这种表由2列或2列以上的数据组成主键。
因此,如果我们表中的主键只包含一列数据,那么这张表一定是符合第二范式要求的。
举例说明,如下为学生选课信息表
CREATE TABLE selectcourse (
student_number INT NOT NULL COMMENT '学号' ,
student_name VARCHAR(16) NOT NULL COMMENT '姓名' ,
student_sex CHAR(1) NOT NULL COMMENT ‘性别’ ,
school_name VARCHAR(16) NOT NULL COMMENT '学生所在学院'
school_phone CHAR(16) NOT NULL COMMENT '学院联系方式'
course_name VARCHAR(16) NOT NULL COMMENT ' 课程' ,
score INT NOT NULL COMMENT COMMENT '成绩' ,
point INT NOT NULL COMMENT COMMENT '学分' ,
PRIMARY_KEY(student_number, course_name) );
在selectcourse表中,由student_number和course_name组成复合主建, 但是point学分列只和course_name课程列相关,与student_number学号列无任何关系。也就是说这张表存在非主键列point只对部分主键course_name的依赖关系,因此这张表的设计不符合第二范式的要求。
为了符合第二范式的要求,我们把上述的selectcourse表拆分成3张表,以符合第二范式要求。
CREATE TABLE student(
student_number INT NOT NULL COMMENT '学号' ,
student_name VARCHAR(16) NOT NULL COMMENT '姓名' ,
student_sex CHAR(1) NOT NULL COMMENT ‘性别’,school_name VARCHAR(16) NOT NULL COMMENT '学生所在学院'
school_phone CHAR(16) NOT NULL COMMENT '学院联系方式'PRIMARY_KEY(student_number));
CREATE TABLE course_info(
course_name VARCHAR(16) NOT NULL COMMENT ' 课程' ,
point INT NOT NULL COMMENT COMMENT '学分' ,
PRIMARY_KEY( course_name) );
CREATE TABLE student_course_info(
student_number INT NOT NULL COMMENT '学号' , course_name VARCHAR(16) NOT NULL COMMENT ' 课程' ,
score INT NOT NULL COMMENT COMMENT '成绩' ,
PRIMARY_KEY(student_number,course_name));
拆分之后,学生信息表student和课程信息表course_info由单一组件构成,肯定符合第二范式要求,而且学生课程信息表student_course_info中,成绩列score必须同时依赖于student_number和course_name,也不存在部分依赖关系,所以也符合第二范式要求。
第三范式 :
每个非主属性即不部分依赖于也不传递依赖于业务主键。也就是在第二范式的基础之上消除非主属性对主键的传递依赖。
在上述的例子中,student表中,学生所在的学院school_name与学生的学号student_number有直接的对应关系,但是学院联系方式school_phone与学生的学号student_number无直接的依赖关系,学院联系方式school_phone依赖于学生所在的学院school_name,进而间接的依赖与学生的学号student_number。因此student表存在非主键对主键的传递依赖关系,所以不符合第三范式。
为了符合第三范式的需求,将student表拆分成2张表。
CREATE TABLE student_info(
student_number INT NOT NULL COMMENT '学号' ,
student_name VARCHAR(16) NOT NULL COMMENT '姓名' ,
student_sex CHAR(1) NOT NULL COMMENT ‘性别’,school_name VARCHAR(16) NOT NULL COMMENT '学生所在学院'
PRIMARY_KEY(student_number));
CREATE TABLE school_info(
school_name VARCHAR(16) NOT NULL COMMENT '学院名词'
school_phone CHAR(16) NOT NULL COMMENT '学院联系方式'PRIMARY_KEY(school_name));
新闻热点
疑难解答