常见的三类范式
想要弄明白常见的三类范式,需要先搞清楚几个基本概念。
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的概念不相符。
去掉部分函数依赖关系的分解步骤如下:
(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(系名,公寓名称)