此博客连接:https://www.cnblogs.com/ping2yingshi/p/13888544.html
说明
数据库字段命名规则要求小写字母。
第一范式
定义
如果一个关系模型R的所有属性都是不可分的基本数据项,则称该关系模式满足第一范式。记作R∈1NF。
举例
建立一张存放学生选课的选课表如下:
分析
表中的课程可以分为课程1,课程2,不满足第一范式中所有属性都不是不可分的要求。所以不符合第一范式。
修改
把表中的课程拆成单独的属性,修改后,所有属性都不可再分,满足第一范式的要求。
第二范式
定义
若关系模式R∈1NF,并且每一个非主属性都完全依赖于R的码,则R∈2NF。
举例
建立一张数据表如下
分析关系模式
说明
上表满足第一范式,所有属性都是不可再分的。
分析
关系模式中存在的非主属性函数依赖:
主码=(stu_id,course_id)
非主属性={stu_name,stu_sex,course_name,teacher,title,score}
非主属性对码的完全函数依赖:(stu_id,course_id)--完全依赖--> score,(stu_id,course_id)--完全依赖--> teacher,(stu_id,course_id)--完全依赖--> Title.
非主属性对码的部分函数依赖:(stu_id,course_id)--部分依赖--> stu_name,stu_id—>stu_name;
(stu_id,course_id)--部分依赖--> stu_sex,stu_id—>stu_sex;
(stu_id,course_id)--部分依赖--> course_name,course_id—>couse_name
由于表中存在非主属性对码的部分依赖,所以不符合第二范式。
修改
把表中的非主属性对码的部分依赖,把表拆成三个表
学生表:
包括:stu_id,stu_name,stu_sex。
课程表:
包括:course_id,course_name。
学生选课表:
包括:stu_id,course_id,teacher,title,score。
把数据表拆分成三个表后,
stu_id--完全依赖-->stu_name,
stu_id--完全依赖-->stu_sex,
course_id--完全依赖-->couse_name。
表中所有非主属性对码都是完全依赖,所以满足第二范式。
第三范式
定义
若关系模式R∈2NF,且每一个非主属性都不传递依敕于码,则R∈3NF。
举例
上面第二范式修改的学生选课表,包括:stu_id,course_id,teacher,title,score。
分析
学生选课表中(stu_id,course_id)-->teacher,teacher-->title,存在传递函数依赖关系(stu_id,course_id)--->title,所以不满足第三范式。
修改
把学生选课表拆分为一个选课表,一个教师表,一个教师职称表
选课表
包括:stu_id,course_id,teacher_id,score
教师表
包括:teacher_id,teacher_name,title_id。
教师职称表
包括:title_id,title_name
拆分后,在选课表中,不存在函数依赖,满足第三范式。
备注
以上每个属性对应多个值时可是枚举出数据个数,例如可以把性别,课程单独建一张表,性别只有两个值,男生和女生;
性别表:
新的学生表: