第四章关系数据库规范化理论一个关系数据库模式由一组关系模式组成,一个关系模式由一组属性名组成。
关系数据库设计,就是如何把已给定的相互关联的一组属性名分组,并把每一组属性名组成关系的问题。
然而,属性的分组不是唯一的,不同的分组对应着不同的数据库应用系统,它们的效率往往相差很远。
为了使数据库设计合理可靠,简单实用,长期以来,形成了关系数据库设计的理论——规范化理论。
4.1 关系规范化的作用规范化,就是用形式更为简洁,结构更加规范的关系模式取代原有关系模式的过程。
如果将两个或两个以上实体的数据存放在一个表里,就会出现下列三个问题:➢数据冗余度大➢插入异常➢删除异常所谓数据冗余,就是相同数据在数据库中多次重复存放的现象。
数据冗余不仅会浪费存储空间,而且可能造成数据的不一致性。
插入异常是指,当在不规范的数据表中插入数据时,由于实体完整性约束要求主码不能为空的限制,而使有用数据无法插入的情况。
删除异常是指,当不规范的数据表中某条需要删除的元组中包含有一部分有用数据时,就会出现删除困难。
(以P98工资表为例)解决上述三个问题的方法,就是将不规范的关系分解成为多个关系,使得每个关系中只包含一个实体的数据。
(讲例子解)当然,改进后的关系模式也存在另一问题,当查询职工工资时需要将两个关系连接后方能查询,而关系连接的代价也是很大的。
那么,什么样的关系需要分解?分解关系模式的理论依据又是什么?分解完后能否完全消除上述三个问题?回答这些问题需要理论指导。
下面,将加以讨论:4.2 函数依赖4.2.1属性间关系实体间的联系有两类:一类是实体与实体之间联系;另一类是实体内部各属性间的联系。
数据库建模一章中讨论的是前一类,在这里我们将学习第二类。
和第一类一样,实体内部各属性间的联系也分为1:1、1:n 和m:n 三类: 例:职工(职工号,姓名,身份证号码,职称,部门) 1、 一对一关系(1:1)设X 、Y 是关系R 的两个属性(集)。
如果对于X 中的任一具体值,Y 中至多有一个值与之对应,反之,对于Y 中的任一具体值,X 中也至多有一个值与之对应,则称X 、Y 两属性间是一对一关系。
如本例职工关系中职工号与身份证号码之间就是一对一关系。
2、一对多关系(1:n )设X 、Y 是关系R 的两个属性(集)。
如果对于X 中的任一具体值,Y 中可以找到多个值与之对应,而对于Y 中的任一具体值,X 中至多只有一个值与之对应,则称属性X 对Y 是一对多关系。
如职工关系中职工号与职称之间就是一对多的关系。
3、多对多关系(m:n )设X 、Y 是关系R 的两个属性(集)。
如果对于X 中的任一具体值,Y 中有n 个值与之对应,而对于Y 中的任一具体值,X 中也有m 个值与之对应,则称属性X 对Y 是一对多(m:n )关系。
例如,职工关系中,职称与部门之间就是多对多的关系。
上述属性间的三种关系,实际上是属性值之间相互依赖与相互制约的反映,因而称之为属性间的数据依赖。
数据依赖共有三种:➢ 函数依赖(Functional Dependency ,FD ) ➢ 多值依赖(Multivalued Dependency ,MVD ) ➢ 连接依赖(Join Dependency ,JD ) 其中最重要的是函数依赖和多值依赖。
4.2.2 函数依赖函数依赖,是属性之间的一种联系。
在关系R 中,X 、Y 为R 的两个属性或属性组,如果对于R 的所有关系r 都存在:对于X 的每一个具体值,Y 都只有一个具体值与之对应,则称属性Y 函数依赖于属性X 。
或者说,属性X 函数决定属性Y ,记作X →Y 。
其中X 叫作决定因素,Y 叫作被决定因素。
上述定义,可简言之:如果属性X 的值决定属性Y 的值,那么属性Y 函数依赖于属性X 。
换一种说法:如果知道X 的值,就可以获得Y 的值,则可以说X 决定Y 。
若Y 函数不依赖于XX →若X →Y ,Y →X ,记作:◆ 如果X 、Y 间是1:1关系,则存在函数依赖 X ←→Y◆ 如果X 、Y 间是1:n 关系,则存在函数依赖: X →Y 或Y →X (多方为决定因素)◆ 如果X 、Y 间是m:n 关系,则不存在函数依赖。
注意,属性间的函数依赖不是指R 的某个或某些关系子集满足上述限定条件,而是指R 的一切关系子集都要满足定义中的限定。
只要有一个具体的关系r (R 的一个关系子集)不满足定义中的条件,就破坏了函数依赖,使函数依赖不成立。
这里的关系子集,指的是R 的某一部分元组的集合,例如:地测学院的学生关系中只包含了地测学院学生的数据,所以它是长安大学学生关系的一个子集。
4.2.3 码的定义前面,我们对码进行了直观化的定义,下面用函数依赖的概念对码作出较为精确的形式化的定义:设K是关系模式R(U,F)中的属性或属性组,K’是K的任一子集。
若K→U,而不存在K'→U,则K为R的候选码(Candidate Key)➢若候选码多于一个,则选其中的一个为主码(Primary Key);➢包含在任一候选码中的属性,叫做主属性(Primary Attribute);➢不包含在任何码中的属性称为非主属性(Nonprime Attribute)或非码属性(Nonkey Attribute)➢关系模式中,最简单的情况是单个属性是码,称为单码(Single Key);最极端的情况是整个属性组是码,称为全码(All-Key)。
前面已多次遇到单码的情况,下面是一个全码的例子:签约(演员名,制片公司,电影名)外码:设有两个关系R和S,X是R的属性或属性组,并且X不是R的码,但X是S 的码(或与S的码意义相同),则称X是R的外部码(Foreign Key),简称外码或外键。
如:职工(职工号,姓名,性别,职称,部门号)部门(部门号,部门名,电话,负责人)其中职工关系中的“部门号”就是职工关系的一个外码。
在此需要注意,在定义中说X不是R的码,并不是说X不是R的主属性,X不是码,但可以是码的组成属性,或者是任一候选码中的一个主属性。
如:学生(学生号,姓名,性别,年龄…)课程(课程号,课程名,任课老师…)选课(学生号,课程号,成绩)在选课关系中,(学生号,课程号)是该关系的码,学生号、课程号又分别是组成主码的属性(但单独不是码),它们分别是学生关系和课程关系的主码,所以是选课关系的两个外码。
关系间的联系,可以通过同时存在于两个或多个关系中的主码和外码的取值来建立。
如要查询某个职工所在部门的情况,只需查询部门表中的部门号与该职工部门号相同的记录即可。
所以,主码和外码提供了一个表示关系间联系的途径。
4.2.4 函数依赖和码的唯一性由上述码的形式化定义,我们可以说:码是由一个或多个属性组成的,可唯一标识元组的最小属性组。
码在关系中总是唯一的,即一个码函数唯一地决定一行。
如果码的值重复,则整个元组都会重复。
否则,违反了实体完整性规则。
而元组的重复则表示存在两个完全相同的实体,这显然是不可能的,所以码是不允许重复取值的。
所以,只有当某个属性或属性组能够函数决定关系中的每一个其它的属性,且该属性组的任何一个真子集都做不到这一点时,该属性或属性组才是该关系的码。
函数依赖是一个与数据有关的事物规则的概念。
如果属性B函数依赖于属性A,那么若知道了A的值,则完全可以找到B的值。
这并非是可以由A的值计算出B的值,而是逻辑上只能存在一个B的值。
4.3 关系模式的规范化一、非规范化的关系当一个表中存在还可以再分的数据项时,这个表就是非规范化的表。
非规范化表存在两种情况:➢表中具有组合数据项(P102表6-4)➢表中具有多值数据项(P103表6-5)当一个关系中的所有分量都是不可再分的数据项时,该关系是规范化的。
即当表中不存在组合数据项和多值数据项,只存在不可分的数据项时,这个表是规范化的。
二维表按其规范化程度从低到高可分为5级范式(Normal Form),分别称为1NF、2NF、3NF(BCNF)、4NF、5NF。
规范化程度较高者必是较低者的子集,即:1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF二、第一范式(1NF)定义1:如果关系模式R中不包含多值属性,则R满足第一范式(First Normal Form),记作:R∈1NF1NF是对关系的最低要求,不满足1NF的关系是非规范化的关系。
非规范化关系转化为规范化关系1NF方法很简单,只要上表分别从横向、纵向展开即可。
如下表:上表虽然符合1NF,但仍是有问题的关系,表中存在大量的数据冗余和潜在的数据更新异常。
原因是(职工号,学历)是右表的码,但姓名、职称、系名、系办地址却与学历无关,只与码的一部分有关。
所以上表还需进一步地规范化。
三、第二范式(2NF)定义1:设X、Y是关系R的两个不同的属性或属性组,且X →Y。
如果存在X的某一个真子集X’,使X’→Y成立,则称Y部分函数依赖于X,记作:X P→Y(Partial)。
反之,则称Y完全函数依赖于X,记作:X F→Y (Full)定义2:如果一个关系R∈1NF,且它的所有非主属性都完全函数依赖于R的任一候选码,则R属于第二范式,记作:R∈2NF。
说明:上述定义中所谓的候选码也包括主码,因为码首先应是候选码,才可以被指定为码。
例如关系模式:职工(职工号,姓名,职称,项目号,项目名称,项目角色)中(职工号,项目号)是该关系的码,而职工号→姓名、职工号→职称、项目号→项目名称…所以(职工号,项目号)P→职称、(职工号,项目号)P→项目名称故上述职工关系不符合第二范式要求。
它存在三个问题:插入异常、删除异常和修改异常。
其中修改异常是这样的,当职工关系中项目名称发生变化时,由于参与该项目的人员很多,每人一条记录,要修改项目信息,就得对每一个参加该项目的人员信息进行修改,加大了工作量,还有可能发生遗漏,存在着数据一致性被破坏的可能。
可把上述职工关系分解成如下三个关系:职工(职工号,姓名,职称)参与项目(职工号,项目号,项目角色)项目(项目号,项目名称)上述三个关系都符合定义2的要求,所以都符合2NF推论:如果关系模式R∈1NF,且它的每一个候选码都是单码,则R∈2NF符合第二范式的关系模式仍可能存在数据冗余、更新异常等问题。
如关系职工信息(职工号,姓名,职称,系名,系办地址)虽然也符合2NF,但当某个系中有100名职工时,元组中的系办地址就要重复100次,存在着较高的数据冗余。
原因是关系中,系办地址不是直接函数依赖于职工号,而是因为职工号函数决定系名,而系名函数决定系办地址,才使得系办地址函数依赖于职工号,这种依赖是一个传递依赖的过程。
所以,上述职工信息的关系模式还需要进一步的规范化。
四、第三范式(3NF)定义1:在关系R中,X、Y、Z是R的三个不同的属性或属性组,如果X→Y,Y→Z,但Y→X,且Y不是X的子集,则称Z传递函数依赖于X。