博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

常见的三类范式

常见的三类范式

原文: 「数据库」常见的三类范式 (baidu.com)

 

想要弄明白常见的三类范式,需要先搞清楚几个基本概念。

 

 

1.概念

 

 

(1)范式:关系数据库中满足某一特定级别关系的集合。即:关系数据库中的关系是要需要满足一定要求的,满足不同的要求即为不同的范式。

 

 

(2)属性:对表格中的每一列人为定义一个名字,这个名字称为属性。

 

 

(3)码:表中(关系中)某个属性组能够唯一地确定一个元组(表中具体的某一行也称为记录),则称该属性或属性组为码。

 

 

(4)候选码:表中(关系中)某个属性组的值能够唯一地标识一个元组(表中具体的某一行也称为记录),则称该属性或属性组为候选码。

 

 

举例理解码与候选码的关系:

 

 

实体学生具备属性:学号、身份证号、姓名3个属性。则{学号}能够唯一的确定一名学生。同理可得{学号,身份证号}、{学号,身份证号,姓名}、{身份证号}、{身份证号,姓名}也能够唯一的确定一名学生,以上均是码。通过观察以上不同的码,有一部分码中包含多余的属性。将这些多余的属性去掉,进行整合,则{学号},{身份证号}为候选码。在创建数据库时可选择其中的一个候选码做为主码,比如{学号}。

 

 

(4)主属性:包含在候选码中的属性,称为主属性。

 

 

上面例子中的学号、身份证号均是主属性。

 

 

(5)非主属性:不包含在候选码中的属性,称为非主属性或非码属性。

 

 

上面例子中的姓名是非主属性。

 

 

(6)主码:若表中(关系中)有多个候选码,则选定其中的一个为主码(主键)。

 

 

(7)外码:在表中(关系中)属性或属性组A不是该关系的码,但A在另一个表中(关系中)是码,则称A是该关系的外部码,也称外码。

 

 

(8)函数依赖:设R为任一给定关系,如果对于R中属性X的每一个值,R中的属性Y只有唯一值与之对应,则称X函数决定Y或称Y函数依赖于X,记作X—>Y。

 

 

比如:上面例子中学号—>姓名

 

 

(9)完全函数依赖:如果X—>Y,而X1是X的任一真子集,不存在X1—>Y,则称Y对X完全函数依赖。

 

 

比如:{学号,数学课程号}—>某学生的数学成绩。

 

 

(10)部分函数依赖:如果X—>Y,而X1是X的任一真子集,存在X1—>Y,则称Y对X部分函数依赖。

 

 

比如:{学号,课程号}—>{课程名},而{课程号}—>{课程名},刚说明课程号部分函数依赖于{学号,课程号}。

 

 

(11)传递依赖:如果存在X—>Y,不存在Y—>X,存在Y—>Z,则Z对X传递函数依赖。

 

 

比如:学号—>班级号,班级号—>班级名称,则学号—>班级名称(班级名称对学号存在传递函数依赖)。

 

 

2.1NF

 

 

如果关系模式R中的所有属性均是最基本属性,即每个属性均不可再分,则称R属于第一范式,简称1NF。

 非第一范式

非第一范式的关系转换为第一范式的关系,将所有属性分解为最基本的属性即可。

第一范式关系

 

3.2NF

 

 

如果关系模式R属于1NF,且每一个非主属性完全函数依赖于主码,则称R属于第二范式,简称2NF。

 

 

解读:如果一个关系R的主码仅有一个属性,那么此关系R属于第二范式。

 

非2NF关系范式

 

上图关系的主码是(学号,课程号),而关系模式中存在学号—>姓名,因此姓名对(学号,课程号)存在部分函数依赖,与2NF的概念不相符。

 

 

去掉部分函数依赖关系的分解步骤如下:

 

 

(1)将主码属性集合的每一个子集作为新的主码构成一个新的关系模式。

 

 

则上图非2NF关系范式可分解为如下三个关系模式。

 

 

S(学号,………)

 

 

K(课程号,……)

 

 

G(学号,课程号,……….)

 

 

(2)将完全依赖于新关系模式主码的属性填写到相应的关系模式中。

 

 

根据上图非2NF关系范式及(1)中的三个新关系模式可得如下三个关系模式。

 

 

S(学号,姓名,性别,系名,公寓名称)

 

 

K(课程号)

 

 

G(学号,课程号,成绩)

 

 

(3)将新关系模式中仅有主码属性的关系模式去掉。

 

 

根据(2)得到的结果去掉表2(课程号)关系模式,最终分解为的关系模式如下:

 

 

S(学号,姓名,性别,系名,公寓名称)

 

 

G(学号,课程号,成绩)

 

 

4.3NF

 

 

如果关系模式R属于2NF,且每一个非主属性不存在传递函数依赖于主码,则称R属于第三范式,简称3NF。

 

 

示例:关系模式S(学号,姓名,性别,系名,公寓名称)中存在学号—>系名,系名—>公寓名称,因此公寓名称对学员传递函数依赖。

 

 

去掉传递函数依赖关系的分解步骤如下:

 

 

(1)依赖于非主码的所有属性,均做删除处理;

 

 

系名—>公寓名称,而系名是非主码,因此从S中删除公寓名称,新的关系S如下:

 

 

S(学号,姓名,性别,系名)

 

 

(2)新建关系模式L,此关系模式包含非主码依赖的所有属性;

 

 

L(系名,公寓名称)

 

 

经过第二范式、第三范式分解后非2NF关系范式转化为以下三个新关系:

 

 

S(学号,姓名,性别,系名)

 

 

G(学号,课程号,成绩)

 

 

L(系名,公寓名称)

 

 
posted @ 2022-06-01 09:49  CHANG_09  阅读(164)  评论(0编辑  收藏  举报