关系模式的好与坏,用什么标准衡量?这个标准就是模式的范式(Normal Forms,简记为NF)。范式的种类与数据依赖有着直接的联系,基于FD的范式有1NF、2NF、3NF、BCNF等多种。
1NF是关系模式的基础;2NF已成为历史,一般不再提及;在数据库设计中最常用的是3NF和BCNF。为了叙述的方便,我们还是从1NF、2NF、3NF、BCNF顺序来介绍。
第一范式(1NF)定义4.13 如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是第一范式(first normal form,简记为1NF)的模式。
满足1NF的关系称为规范化的关系,否则称为非规范化的关系。关系数据库研究的关系都是规范化的关系。例如关系模式R(NAME,ADDRESS,PHONE),如果一个人有两个电话号码(PHONE),那么在关系中至少要出现两个元组,以便存储这两个号码。
1NF是关系模式应具备的最起码的条件。
第二范式(2NF)定义4.14 对于FD W→A,如果存在X W有X→A成立,那么称W→A是局部依赖(A局部依赖于W,即依赖于W的子集X,并不需要W中其它的属性);否则称W→A是完全依赖。完全依赖也称为“左部不可约依赖”。
定义4.15 如果A是关系模式R的候选键中属性,那么称A是R的主属性;否则称A是R的非主属性。
定义4.16 如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么称R是第二范式(2NF)的模式。如果数据库模式中每个关系模式都是2NF,则称数据库模式为2NF的数据库模式。
例4.14 设关系模式R(S#,C#,GRADE,TNAME,TADDR)的属性分别表示学生学号、选修课程的编号、成绩、任课教师姓名和教师地址等意义。(S#,C#)是R的候选键。
R上有两个FD:(S#,C#)→(TNAME,TADDR)和C#→(TNAME,TADDR),因此前一个FD是局部依赖,R不是2NF模式。此时R的关系就会出现冗余和异常现象。譬如某一门课程有100个学生选修,那么在关系中就会存在100个元组,因而教师的姓名和地址就会重复100次。
如果把R分解成R1(C#,TNAME,TADDR)和R2(S#,C#,GRADE)后,不存在(S#,C#)→(TNAME,TADDR),所以局部依赖就消失了。R1和R2都是2NF模式。
在关系模式R中消除非主属性对候选键的局部依赖的方法可用下列算法表示。
算法4.4 将关系模式R分解成2NF模式集的算法
设关系模式R(U),主键是W,R上还存在FD X→Z,并且Z是非主属性,且X W,那么W→Z就是一个局部依赖。此时应把R分解成两个模式
R1(XZ),主键是X;
R2(Y),其中Y=U –Z(除了 Z 之外的非主属性与主键W(包含X)),主键仍是W,外键是X(REFERENCES R1)。
利用外键和主键的联接可以从R1和R2重新得到R。
如果R1和R2还不是2NF,则重复上述过程,一直到数据库模式中每一个关系模式都是2NF为止。
第三范式(3NF)定义4.17 如果X→Y,Y→A,且Y→X和 A∈Y,那么称X→A是传递依赖(A传递依赖于X)。
定义4.18 如果关系模式R是1NF,且每个非主属性都不传递依赖于R的候选键,那么称R是第三范式(3NF)的模式。如果数据库模式中每个关系模式都是3NF,则称其为3NF的数据库模式
例4.15 在例4.14中,R2是2NF模式,而且也已是3NF模式。但R1(C#,TNAME,TADDR)是2NF模式,却不一定是3NF模式。如果R1中存在函数依赖C#→TNAME和TNAME→TADDR,那么C#→TADDR就是一个传递依赖,即R1不是3NF模式。此时R1的关系中也会出现冗余和异常操作。譬如一个教师开设五门课程,那么关系中就会出现五个元组,教师的地址就会重复五次。
如果把R1分解成R11(TNAME,TADDR)和R12(C#,TNAME)后,C#→TADDR就不会出现在R11和R12中。这样R11和R12都是3NF模式。
在关系模式R中消除非主属性对候选键传递依赖的方法可用下列算法表示。
算法4.5 将关系模式R分解成3NF模式集的算法
设关系模式R(U),主键是W,R上还存在FD X→Z。并且Z是非主属性,且Z?X,X不是候选键( W X),这样W→Z就是一个传递依赖。此时应把R分解成两个模式:
R1(XZ),主键是X;
R2(Y),其中Y=U-Z,主键仍是W,外键是X(REFERENCES R1)。
利用外键和主键相匹配机制,R1和R2通过联接可以重新得到R。
如果R1和R2还不是3NF,则重复上述过程,一直到数据库模式中每一个关系模式都是3NF为止。
定理4.9 如果R是3NF模式,那么R也是2NF模式。(用逆反命题证明,即不是2NF 不是3NF)
(局部依赖和传递依赖是模式产生冗余和异常的两个重要原因。3NF模式中不存在非主属性对候选键的局部依赖和传递依赖,因此消除了很大一部分存储异常,具有较好的性能。通常把低范式的关系模式,转换成3NF或更高的范式,这种变换过程,称为“关系的规范化处理”。)
定理4.10 设关系模式R,当R上每一个FD X→A满足下列三个条件之一时:A∈X(即X→A是一个平凡的FD);X是R的超键;A是主属性。关系模式R就是3NF模式。
定理4.10.设关系模式R,当R上每一个FD X→A满足下列条件之一时:关系R就是3NF
①A∈X(即X A是一个平凡的FD); ②X是R的超键; ③A是主属性。
如果上面三个条件都不成立,那么对于X→A,就有A不是主属性且X不是超键。此时若设候选键为W,就有W→X,X→A,因此W→A是一个传递依赖。也就是非主属性A传递依赖于R的候选键。
定义4.18’ 设F是关系模式R的FD集,如果对F中每个非平凡的FD X Y,都有X是R的超键,或者Y的每个属性都是主属性,那么称R是3NF的模式。
这个定义表明,如果非平凡的FD X Y,X
(不包含超键(并且Y不是主属性),那么Y必传递依赖于候选键,因此R不是3NF模式。
如果X不是超键,那么X可以是候选键或者只是候选键中的一部分。这时可以设候选键为W,可以推导出W X,由于X Y,所以就有W Y,即Y传递依赖于候选键,因此R不是3NF。如果X是超键,那么W X,也就不会产生传递依赖。所以X必须为超键,而不是候选键。)A