|
1. 第一范式(1NF)
第一范式规定关系的每一个分量必须是一个不可分的数据项。
非第一范式的例子如表5-5,可以转换为第一范式如表5-6。
几乎所有的商用关系DBMS都要求关系为第一范式,现在流行的关系数据库语言,如SQL,也都只支持第一范式。
如果关系仅仅满足第一范式的条件是不够的,可能会存在更新异常。为了消除这些异常,需要进行关系的规范化。
下面是满足第一范式的(不好的)关系模式的例子。例如:设有一关系模式R(S#,C#,G,TN,D),其中(S#)为学号,C#为课程号,G为成绩,TN为任课教师姓名,D为教师所在系名,这些数据具有下列语义:
(1) 学号是一个学生的标识,课程号是一门课程的标识。
(2) 一位学生所修的每门课程都有一个成绩。
(3) 每门课程只有一位任课教师,但一位教师可以教多门课。
(4) 教师中没有重名,每位教师只属于一个系。
下面是一个具体关系实例的数据,如表5-7:
虽然上述的关系模式只有四个属性,但它是一个不好的关系模式,因为该模式在使用过程中有以下几个问题:
(1) 数据冗余。例如,教师所在系名对选该教师所开课的所有学生都重复输入一次。
(2) 插入异常。由于关系的主键{S#, C#} 不能为空值,如果一个教师不教课,则这位教师的姓名及所属的系名就不能插入表中。
(3) 删除异常。如果所有学生都退选某一门课,则有关该门课的其它数据(任课教师名及所在系名)也将被删除。
(4) 修改异常。如果改变一门课的任课教师,则需要修改表中选修该门课程的多行记录,如果部分修改,部分不修改,则会导致数据的不一致。
上述关系模式只所以是一个不好的关系模式,是因为模式中存在部分函数依赖和传递函数依赖。消除这些部分函数依赖和传递函数依赖,就可以得到一个比较好的关系模式。
根据上述示例说明的语义,找出有下面的函数依赖集合F:
F = { {S#, C#}→ G,C#→TN,TN → D}
针对函数依赖集合,运用关系数据库设计理论,可以对上述关系进行分解,得到3个关系模式如下:
SCG(S#, C#, G)
CTN(C#, TN)
TND(TN, D)
上述3个关系可以消除数据冗余,插入异常,删除异常和修改异常等现象。是一个比较好的关系模式。把原来一个关系表的数据分解为三个关系表存放。
具体的关系实例的数据如表5-8,5-9,5-10:
对于上述示例,是满足第一范式的关系模式,但它不是一个好的关系模式,存在数据冗余和操作异常现象。通过分析模式属性间的函数依赖关系,把一个模式分解为三个关系模式后,消除了数据冗余和操作异常。对于任一给定的模式,如何判断是一个好的还是不好的关系模式呢?又如何把一个不好的关系模式分解转换为好的关系模式呢?这就是在下面要讨论的问题,对关系模式中X→Y的函数依赖关系,给出不同程度的限制,得到满足不同范式要求的模式。
2.第二范式(2NF)
如果关系模式R满足第一范式,且它的任何一个非主属性都完全函数依赖于任一个候选码,则R满足第二范式(简记为2NF)。
例5:是1NF但不是2NF的关系模式。设有关系模式如下:
REPROT(S#, C#, TITLE, LNAME, ROOM#, MARKS), 其中S#是学号,C#是课程号,TITLE为课程名,LNAME是教师名,ROOM#是教室号,MARKS是分数。
关系中的一个元组<s, c, t, l, r, m>表示学生s在课程c中的得分为m,课程名为t, 由教师 l 讲授,其教室编号为r。
若每门课只由一位教师讲授,每位教师可讲授多门课程,但只有一个教室,即只在一个教室中讲课,则REPORT的函数依赖如下:
(S#, C#) →MARKS
C#→TITLE
C#→LNAME
LNAME→ROOM#
关系模式REPROT(S#, C#, TITLE, LNAME, ROOM#, MARKS)的码是(S#, C#),非主属性TITLE,LNAME 和 ROOM# 对码是部分函数依赖,并存在传递函数依赖C#→LNAME,LNAME→ROOM#。REPORT属于1NF,不属于2NF。
为了消除部分函数依赖,将REPORT关系模式分解为REPORT1和COURSE这二个关系模式:
REPORT1(S#, C#, MARKS)
函数依赖是(S#, C#) →MARKS
COURSE(C#, TITLE, LNAME, ROOM#)
函数依赖是C#→TITLE, C#→LNAME,
LNAME→ROOM#。
REPORT1和COURSE都消除了对码的部分函数依赖,因此都属于2NF。一个关系模式仅仅满足2NF仍是不够的,如在关系模式COURSE (C#, TITLE, LNAME, ROOM#)中,仍存在着插入,删除和修改异常问题:
· 新来的教师,还没有分配授课之前,教师的姓名及教室编号都不能加到关系中;
· 如果要修改某个教师的教室编号,必须修改与教师授课相对应的各元组中的教室编号,因为一位教师可能会教多门课。
存在上述这些问题的原因是关系模式COURSE中存在传递函数依赖,所以要把关系模式COURSE向第三范式转化,除去非主属性对码的传递函数依赖。
3.第三范式(3NF)
如果关系模式R满足 2NF,并且它的任何一个非主属性都不传递依赖于任何候选码,则称R是第三范式 (3NF), 记作R3NF。
在上面的例5中,关系模式:
COURSE(C#, TITLE, LNAME, ROOM#)
其中存在非主属性ROOM#对码的传递依赖,即:
C#→LNAME, LNAME→ROOM# ,
因此COURSE不属于3NF。
将COURSE分解为:
COURSE1(C#, TITLE, LNAME) 和
LECTURE(LNAME, ROOM#),
则关系模式COURSE1和LECTURE中都没有传递函数依赖,因此 COURSE1 和 LECTURE 都属于3NF。
至此,关系模式REPORT分解为下列3个属于3NF的一组关系模式:
REPORT1 (S#, C#, MARKS)
COURSE1 (C#, TITLE, LNAME)
LECTURE (LNAME, ROOM#)
和关系模式REPORT相比,这些关系模式是对现实世界更加精确的描述。把这3个关系进行连接,总能重构初始的关系。
4.BCNF范式
BCNF (Boyce Codd Normal Form) 是由Boyce 和 Codd 提出的,通常认为BCNF是3NF的修正,有时也称为扩充的第三范式。
定义:关系模式R∈1NF,若X→Y,且YX 时,X必含有候选码,则R∈BCNF。
也就是说,在关系模式R中,若R的每一个决定因素都包含候选码,则R∈BCNF。
由BCNF的定义可知,一个满足BCNF的关系模式有如下特性:
● 每个非主属性对每个码都是完全函数依赖;
● 所有的主属性对每一个不包含它的码,也是完全函数依赖;
● 没有任何属性完全函数依赖于非码的任何一组属性。
● 若R∈BCNF,则R∈3NF。若R∈3NF,则R不一定于BCNF。
例6:一个是3NF但不是BCNF的关系模式。
设有关系模式STJ(S, T, J),S表示学生,T表示教师,J表示课程。每一教师只教一门课,每门课有若干教师,某一学生选定某门课,就对应一个固定的教师,由语义可得到如下的函数依赖关系:
(S, J) →T; (S, T) →J; T→J, 即
-学生,所选课程决定授课教师;
-学生,授课教师决定所选课程;
-教师决定所授课程;
函数依赖的图形表示如图5-4所示。
由图中可以看到:
· (S,J)和(S,T)都是候选码;S,T,J都是主属性。
· STJ3NF,因为没有任何非主属性对候选码的传递函数依赖或部分函数依赖。
· STJBCNF,因为T是决定因素,但T不包含码。
· 对于不是BCNF的关系模式,仍然存在不合适的地方。
例如,在例6中,当课程已设置,并已确定教师,但还没有学生选课,则教师和课程的信息就不能加入到数据库中。
非BCNF的关系模式可以通过分解成为BCNF,例如STJ可以分解为ST(S, T)和TJ(T, J), 则ST和TJ都是属于BCNF范式。BCNF是3NF的进一步规范化,即限制条件更为严格。3NF中,对于Y是非主属性的非平凡函数依赖X→Y,允许有X不包含码的情况。而在BCNF中,不管Y是主属性还是非主属性,只要X不包含码,就不允许有X→Y这样的非平凡函数依赖。因此,若R∈BCNF,则必有R∈3NF。然而,BCNF又是概念上更加简单的一种范式,判断一个关系模式是否属于BCNF,只要考察每个非平凡函数依赖X→Y的决定因素X是否包含码就行了。
3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的限度。一个关系数据库中的所有关系模式如果都属于BCNF,这在函数依赖范畴内,就已经实现了彻底的分离,达到了最高的规范化程度,并消除了插入异常和删除异常。3NF的不彻底性表现在可能存在主属性对码的部分函数依赖和传递依赖。
5.第四范式(4NF)
第四范式是BCNF的推广,它适用于多值依赖的关系模式。
定义:设关系模式R属于1NF,如果对于R的每个非平凡多值依赖X→→Y(YX),X都包含码,则称R为第四范式,表示为R4NF。如果一个关系模式属于BCNF,但没有达到4NF,仍然存在操作中的异常问题。例如,在关系模式TSC中,数据的冗余度很大。解决的方法是分解TSC为 TS (T, S)和 TC(T, C),则TC和TS都是第四范式。对应的关系如表5-11和5-12。
显然4NF是用多值依赖的概念定义的,但4NF是BCNF的进一步规范化。可以证明,若R4NF,则必有RBCNF。
6.关系模式规范化设计实例2
有学生基本情况的关系模式STUDENT:
STUDENT(SNO,SNAME,AGE,SEX,CLASS,DEP,CNO,CNAME,GRADE,SCORE)
该关系模式的函数依赖集
F={ SNO→SNAME,SNO→AGE,SNO→SEX,SNO→CLASS,SNO→DEP,CLASS→DEP, CNO→CNAME,CNO→SCORE,SNO+CNO→GRADE }
该模式的码是(SNO, CNO)该模式是属于1NF:满足的条件是元组的每个分量必须是不可分的数据项。它不是一个好的关系模式。同学自己分析为什么是一个不好的关系模式?
(1)修改设计使其满足第二范式2NF关系模式STUDENT不符合2NF要求。因为其中存在部分函数依赖。
· 关系模式STUDENT的主码是(SNO,CNO)。
· 非主属性SNAME,AGE,SEX,CLASS,DEP,CNAME,GRADE,SCORE
· 非主属性中存在对码的部分函数依赖,如,SNO→SNAME,CNO→CNAME。
消除部分函数依赖,将STUDENT关系模式进行分解,消除部分函数依赖,得到三个关系模式符合2NF要求:
· STUDENT2(SNO,SNAME,AGE,SEX,CLASS,DEP)
· COURSE(CNO,CNAME,SCORE)
· SC(SNO,CNO, GRADE)
分解后,在STUDENT2模式中,仍然存在数据冗余,以及插入和删除异常。因为在STUDENT2模式中,仍然有非主属性中对码的传递函数依赖
(2)修改设计使其满足第三范式3NF关系模式STUDENT2不满足第三范式要求,因为存在传递依赖。如
SNO→CLASS→DEP,消除传递依赖,分解STUDENT2如下:
· STUDENT3(SNO,SNAME,AGE,SEX,CLASS)CLASS(CLASS,DEP)
至此,关系模式STUDENT分解为4个3NF的关系模式:
· STUDENT3(SNO,SNAME,AGE,SEX,CLASS)CLASS(CLASS,DEP)
· COURSE(CNO,CNAME,SCORE)
· SC(SNO,CNO, GRADE)
(3) 修改设计使其满足BCNF范式
分析STUDENT分解的四个关系模式,它们是满足第三范式的,同时也是满足BCNF范式的。
例1,关系模式课程COUSE(CNO,CNAME,SCORE)
其中只有一个码CNO,没有任何属性对码有部分和传递函数以来,所以COUSE?3NF。
同时,COUSE中CNO是唯一的决定因素,因此COUSE?BCNF。
例2, 在关系模型例2中,有关系模式CSZ(CITY,ST,ZIP),其中城市 CITY,街道 ST,邮政编码 ZIP。
关系模式CSZ3NF。但是,关系模式CSZBCNF,因为函数依赖ZIP→CITY的决定因素ZIP不包含码,所以CSZBCNF。
若将关系模式CSZ分解为两个关系模式:
ZC(ZIP,CITY)和
SZ(ST,ZIP),
它们就都是BCNF的关系模式了。
7.规范化小结
(1) 规范化的基本思想是逐步消除数据依赖中不合适的部分,使关系模型中的各关系模式达到某种程度的"分离",以解决关系模式中存在的插入、删除、修改异常和数据冗余等毛病。但关系模式的分解不是唯一的。
(2) 数据库设计是一个相当复杂而且是具有很强应用性的工作,规范化理论仅仅从一个侧面提供了改善关系模式的理论和方法。(3) 规范化程度是衡量一个关系模式好坏的标准之一,但不是唯一的标准。
(4) 一个关系数据库模式中的关系模式都属于BCNF,则在函数依赖的范畴内,已实现了彻底的分离,消除了插入、删除和修改异常。
(5) 在实际设计中,并不是规范化程度越高越好,这取决于应用。因为对规范化程度高的关系模式进行查询时,可能要做更多的连接操作。
例如,原来的STUDENT数据模式中存在数据冗余度大,及插入,删除和修改异常现象,但用来查询非常方便。对原数据模式进行分解后,所带来的问题是对某些查询需要进行开销很大的连接操作,可能影响数据库的性能。
8. 第四范式设计示例2
在函数依赖范畴内,BCNF达到了最高的规范化程度。BCNF的关系模式是否就很完美呢?我们先看一个例子:
关系模式WSC(W,S,C)中W表示仓库,S表示保管员,C表示物品。假设每个仓库有若干个保管员,存放若干种物品。每种物品由存放仓库中的所有保管员负责保管。现有仓库、保管员、物品一组数据如下表5-13所示:
关系模式WSC的属性之间没有任何函数依赖,(W,S,C)是码。WSC?BCNF,但关系模式有明显的毛病:数据冗余。若仓库W1增加一个保管员S3,则必须插入W1S3C1,W1S3C2,W1S3C3三个元组,若仓库W2减少一种物品C4,则必须删除W2S1C4,W2S2C4两个元组。造成上述问题的原因是关系模式WSC的属性之间存在一种称为多值依赖的数据依赖。
4NF是限制关系模式的属性之间不允许有非平凡函数依赖的多值依赖。因为根据定义,要求每一个非平凡的多值依赖X→→Y(Y X),都有X包含码,当然就有X→Y。所以,之所以允许的非平凡多值依赖实际上是函数依赖。
关系模式WSC中,W→→S,W→→C,都是非平凡的多值依赖,而W中又不含码(W,S,C),因此WSC4NF。正是由于W→→S,W→→C,这样的非平凡依赖,且非函数依赖的多值依赖的存在,造成关系模式WSC的数据冗余。若将WSC分解为两个关系模式:WS(W,S),WC(W,C),就不再有非平凡依赖且非函数依赖的多值依赖,就都是4NF的关系模式了。
[ 本帖最后由 cayean 于 2007-1-29 10:58 编辑 ] |
|