1.6 关系数据库的规范化
在设计关系数据库时,不是随便哪种关系模式设计方案都可行,更不是任何一种关系模式都可以投入应用,一个好的关系模式必须满足一定的规范化要求。用户在设计关系数据库时,每一个关系都要遵守不同的规范要求。不同的规范化程度可用范式来衡量。范式(Normal Form)是符合某一种级别的关系模式的集合,是衡量关系模式规范化程度的标准,符合标准的关系才是规范化的。范式可以分为多个等级:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)、第四范式(4NF)、第五范式(5NF)等。满足最低要求的为第一范式,在第一范式基础上进一步满足一些要求的为第二范式,其余以此类推。通常情况下,数据规范到第三范式就可以了。将这三个范式应用到数据库设计中,能够减少数据冗余,消除插入异常、更新异常和删除异常。
1.6.1 第一范式(1NF)
如果关系模式R中所有的属性都是不可分解的,则称该关系模式R满足第一范式(First Normal Form),简称1NF,记作R∈1NF。
表1-2中的联系方式属性可以分成系别和班级两个属性,故不符合1NF的要求。如何将该表规范成1NF呢?可以有两种方法。一种方法是将联系方式属性展开,如表1-3所示。另一种方法是将该关系分解为两个关系,如表1-4和表1-5所示。在关系数据库中,1NF是对关系模式设计的最基本要求。
表1-2 学生信息表
表1-3 学生信息表
表1-4 学生信息表
表1-5 联系方式表
1.6.2 第二范式(2NF)
在学习2NF之前需要先了解一下函数依赖、完全函数依赖和部分函数依赖的概念。
通俗地讲,假设A、B是关系模式R中的两个属性或属性组合,A的值一旦给定,B的值就能唯一确定,称A函数确定B或B函数依赖于A,记作A→B。例如,对于教学关系R(学号,姓名,年龄,性别,系名,系主任,课程名,成绩),其中学号属性的值一旦确定了,姓名属性的值也就唯一确定了,姓名函数依赖于学号,记作:学号→姓名。此关系中的函数依赖还有:学号→年龄,学号→性别,学号→系名,学号→系主任,系名→系主任,(学号,课程名)→成绩,(学号,姓名)→系名,等等。
如果A→B是R的一个函数依赖,且对于A的任何一个真子集A’,A’→B都不成立,则称A→B是完全函数依赖。反之,如果A’→B成立,则称A→B是部分函数依赖。例如,在教学关系R中,对于(学号,课程名)→成绩这个函数依赖,学号→成绩和课程名→成绩都不成立,所以(学号,课程名)→成绩是完全函数依赖。而对于(学号,姓名)→系名这个函数依赖,学号→系名成立,所以(学号,姓名)→系名是部分函数依赖。
那么什么是第二范式(2NF)呢?
如果一个关系模式R∈1NF,且R中的每一个非主属性都完全函数依赖于码,则称该关系模式R满足第二范式(Second Normal Form),简称2NF,记作R∈2NF。
例如表1-3所示的学生信息表,学号能唯一地标识出该表中的每一行,所以学号是该表的主关键字。学号为“X171001”的学生姓名是“张无忌”,学生姓名完全能由学号来决定,也就是说有一个学号就会有且只有一个姓名与它对应,则称姓名完全函数依赖学号,也可以说学号决定了姓名。同理,表1-3中的性别、年龄、系别、班级属性也完全函数依赖于学号,符合2NF的要求。
2NF是在1NF的基础上建立起来的,要求实体的非主属性必须完全依赖于主码,不能存在仅依赖主码一部分的属性,如果存在则要把这个属性和主码的这一部分分离出来形成一个新的关系。例如,学生成绩表(学号,姓名,课程号,课程名,成绩)中,“学号”和“课程号”字段组成主码,“成绩”完全依赖于该主码,但是“姓名”和“课程名”都只是部分依赖于主码,“姓名”可以由“学号”确定,并不需要“课程号”,而“课程名”是由“课程号”决定,并不依赖于“学号”。所以该关系模式就不符合2NF,可以将其分解为三个符合2NF的关系模式:
(1)学生信息表(学号,姓名)
(2)课程信息表(课程号,课程名)
(3)成绩表(学号,课程号,成绩)
不满足2NF的关系会出现诸如插入异常、删除异常和修改复杂等问题。
1.6.3 第三范式(3NF)
如果一个关系模式R∈2NF,且R中的每个非主属性都不传递函数依赖于码,则称该关系模式R满足第三范式(Third Normal Form),简称3NF,记作R∈3NF。
所谓传递函数依赖是指假设A、B、C是关系模式R中的3个属性或属性组合,如果A→B, B A,B A,B→C,则称C对A传递函数依赖,传递函数依赖记作A→C。
例如,学生信息表(学号,姓名,年龄,班级号,班主任)中,“班主任”依赖于“学号”。“班主任”对“学号”的依赖,是因为“班主任”依赖于“班级号”,“班级号”依赖于“学号”而产生的。这样就构成了传递依赖,因此不符合3NF。
要想让这个关系模式符合3NF,可以将其分解为两个关系模式:
(1)学生信息表(学号,姓名,年龄,班级号)
(2)班级信息表(班级号,班主任)