数据库中的范式

此博客连接: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

拆分后,在选课表中,不存在函数依赖,满足第三范式。

备注

以上每个属性对应多个值时可是枚举出数据个数,例如可以把性别,课程单独建一张表,性别只有两个值,男生和女生;

性别表:

 新的学生表:

出来混总是要还的
原文地址:https://www.cnblogs.com/ping2yingshi/p/13888544.html