250 likes | 349 Views
4.2 范式. 范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求。满足最底要求的叫第一范式,简称为 1NF 。在第一范式基础上进一步 满足一些要求的为第二范式,简称为 2NF 。其余以此类推。目前主要有六种范式:第一范式、第二范式、第三范式、 BC 范式、第四范式、第五范式。显然各种范式之间存在联系: 1NF 2NF 3NF BCNF 4NF 5N F 如下图所示,通常把某一关系模式 R 为第 n 范式简记为: R nNF 。. 非规范化关系. 1 NF. 2 NF. 3 NF. BC NF.
E N D
4.2 范式 范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求。满足最底要求的叫第一范式,简称为 1NF。在第一范式基础上进一步 满足一些要求的为第二范式,简称为 2NF。其余以此类推。目前主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式、第五范式。显然各种范式之间存在联系: 1NF 2NF 3NF BCNF 4NF 5NF 如下图所示,通常把某一关系模式R为第n范式简记为: RnNF 。
非规范化关系 1NF 2NF 3NF BCNF 4NF 5NF 非主属性函数依赖于码 非主属性完全函数依赖于码 非主属性既不部分依赖于码也不传递依赖于码 所有属性都不部分依赖或传递依赖于码,所有决定属性集都包含码 所有非平凡的多值依赖都是函数依赖 连接依赖均由候选码所蕴含
4.2.1 第一范式(1NF) (Sno,Cno) f p p Grade (Sno,Cno) (Sno,Cno) Sdept Sloc 定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则R1NF 。 在任何一个关系数据库中,第一范式是对关系模式的一个最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。 但是满足第一范式的关系模式并不一定是一个好的关系模式。 例: 关系模式 SLC ( Sno, Sdept, Sloc, Cno, Grade) 其中Sloc为学生的住处,假设每个系的学生住在同一个地方。SLC的码为(Sno,Cno)。函数依赖包括: Sno→Sdept Sno→Sloc Sdept→Sloc (因为每个系只住一个地方)
候选码 Sno Sdept Grade Cno Sloc 用下图表示函数依赖:图中的实线表示完全函数依赖,虚线表示部分函数依赖。 • 显然SLC满足第一范式。但我们发现SLC关系存在以下4个问题: • 插入异常:假若要插入一个Sno=95102,Sdept=IS,Sloc=N,但还未选课的学生,即这个学生无Cno,这样的元组不能插入SLC中,因为插入时必须给定码值,而此时码值的一部分为空,因而学生的信息无法插入。
2.删除异常:假定某个学生只选修了一门课,如95022只选修了3号课程。现在连3号课程他也不选修了,那么3号课程这个数据项就要删除。课程号3是主属性,删除了课程号3,整个元组就不能存在了,也必须跟着删除,从而删除了95022的其他信息,产生了删除异常,即不应删除的也删除了。2.删除异常:假定某个学生只选修了一门课,如95022只选修了3号课程。现在连3号课程他也不选修了,那么3号课程这个数据项就要删除。课程号3是主属性,删除了课程号3,整个元组就不能存在了,也必须跟着删除,从而删除了95022的其他信息,产生了删除异常,即不应删除的也删除了。 3.数据冗余度大:如果一个学生选修了10门课程,那么他的Sdept和Sloc值就要重复存储10次。 4.修改复杂:某个学生从数学系(MA)转到信息系(IS),这本来只是一件事,只需修改此学生元组中的Sdept值,但因为关系模式SLC中还含有系的住处Sloc属性,学生转系将同时改变住处,因而还必须修改元组中Sloc的值。另外,如果这个学生选修了K门课,由于Sdept,Sloc重复存储了K次,当数据更新时必须无遗漏地修改K个元组中全部Sdept,Sloc信息,这就造成了修改的复杂化。
4.2.2 第二范式(2NF) 关系模式SLC出现上述问题的原因是Sdept。Sloc对码的部分函数依赖。为了消除这些部分函数依赖 ,可以采用投影分解法,把SLC分解为两个关系模式: SC(Sno,Cno,Grade) SL(Sno,Sdept,Sloc) 其中SC的码为(Sno,Cno),SL的码为Sno。这两个关系模式的函数依赖如图4-4所示。 候选码 候选码 图 4-4 SC的函数依赖与SL的函数依赖 Sdept Sno Grade Sno Cno Sloc
显然,在分解后的关系中,非主属性都完全函数依赖于码了。从而使上述4个问题在一定程度上得到了一定的解决。显然,在分解后的关系中,非主属性都完全函数依赖于码了。从而使上述4个问题在一定程度上得到了一定的解决。 ①在SL关系中可以插入尚未选课的学生。 ②删除学生选课情况涉及的是SC关系,如果一个学生所有的选课记录全部删除了,只是SC关系中没有关于该学生的记录了,不会牵涉到SL关系中关于该学生的记录。 ③由于选修课程的情况与学生的基本情况是分开存储在两个关系中的,因此不论该学生选多少门课程,他的Stept和Sloc值都只1次.这就大大降低了数据冗余。 ④某个学生从数学系(MA)转到信息系(IS),只需SL关系中该学生元组的Sdept值和Sloc值,由于Sdept,Sloc并未重复存储,因此减化了修改操作。
定义 4.7 若关系模式的R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。 2NF就是不允许关系模式的属性之间有这样的函数依赖X→Y,其中X是码的真子集,Y是非主属性。显然,码只包含一个属性的关系模式如果属于1NF,那么它一定属于2NF,因为它不可能存在非主属性对码的部分函数依赖。 上例中的SC关系和SL关系都属于2NF。可见,采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。 例如,2NF关系模式SL(Sno,Sdept,Sloc)中有下列函数依赖: Sno→Sdept Sdept→Sloc Sno→Sloc
我们看到,Sloc传递函数依赖于Sno,即SL中存在非主属性对码的传递函数依赖。SL关系中仍然存在插入异常、删除异常、数据冗余度大和修改复杂的问题。我们看到,Sloc传递函数依赖于Sno,即SL中存在非主属性对码的传递函数依赖。SL关系中仍然存在插入异常、删除异常、数据冗余度大和修改复杂的问题。 ①插入异常:如果某个系因种种原因(例如,刚刚成立),目前暂时没有在校学生,就无法把这个系的信息存入数据库。 ②删除异常:如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系的信息也丢掉了。 ③数据冗余度大:每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同。 ④修改复杂:当学校调整学生住处时,比如信息系的学生全部迁到另一地方住宿,由于关于每个系的住处信息是重复存储的,修改时必须同时更新该系所有学生的Sloc属性值。
4.2.3第三范式(3NF) Sno Sdept Sdept Sloc 关系模式SL出现上述问题的原因是Sdept,Sloc对码的部分函数依赖。为了消除这些部分函数依赖,可以采用投影分解法,把SLC分解为两个关系模式: SC(Sno,Cno,Grade) SL(Sno,Sdetp,Sloc) 其中SC的码为(Sno,Cno),SL的码为Sno。这两个关系模式的函数函数依赖如图4-5所示。 候选码 候选码 图4-5 SD的函数依赖与DL的函数依赖
显然在分解后的关系模式中既没有非主属性对码的部分函数依赖也没有非主属性对码的传递函数依赖,在一定程度上解决了上述4个问题。显然在分解后的关系模式中既没有非主属性对码的部分函数依赖也没有非主属性对码的传递函数依赖,在一定程度上解决了上述4个问题。 ①DL关系中可以插入无在校学生的系的信息。 ②某个系的学生全部毕业了,只是删除SD关系中的相应元组,DL关系中关于该系的信息仍存在。 ③关于系的住处的信息只在DL关系中存储一次。 ④当学校调整某个系的学生住处时,只需修改DL关系中一个相应元组的Sloc属性值。 定义 4.8如果关系模式R<U,F>中不存在候选码X、属性组Y以及非主属性Z(Z⊈Y),使得X→Y,Y→Z和Y X成立,则R∈3NF。 由定义4.8可以证明,若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码,也不传递函数领带于候选码。显然,如果R∈3NF,则R也是2NF。 3NF就是不允许关系属性之间有这样的非平凡函数依赖于X→Y,其中X不包含码,Y是非主属性。X不包含码有两种情况,一种情况X是码的真子集,这是2NF也不允许的,另一种情况X含有非主属性,这是3NF进一步限制的。 上例中的SD关系和DL关系都属于3NF。可见,采用投影分解法的将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在原插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。也就是说,属于3NF的关系模式并不一定是一个好的关系模式。将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。也就是说,属于3NF的关系模式并不一定是一个好的关系模式。 例如,在关系模式STJ(S,T,J)中S表示学生T表示教师,J表示课程。假设每一教师只教一门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。于是,有如下的函数依赖(如图4-6所示) (S,J)→T, (S,T)→J, T→J 显然,(S,J)和(S,T)都可以作为候选码。这两个候选码各由两个属性组成,而且是相交的。该关系模式不没有任何非主属性对码传递依赖或部分依赖,所以STJ∈3NF。但另一方面,T→J,即T是决定属性集,可是T只是主属性,它既不是候选码,也不包含候选码。
3NF的STJ关系模式也存在一些问题。 ①插入异常:如果某个学生刚刚入校,尚未选修课程,则因受主属性不能为空的限制,有关信息无法存入数据库中。同样原因,如果某个教师开设了某门课程,但尚未有学生选修,则有关信息也无法存入数据库中。 ②删除异常:如果选修过某门课程的学生全部毕业了,在删除这些学生元组的同时,相应教师开设该门课程的信息的也同时丢掉了。 ③数据冗余度大:虽然一个教师一门课,但每个选修该教师该门课程的学生元组都要记录这一信息。 ④修改复杂:某个教师开设的某门课程改名后,所有选修了该教师该门课程的学生元组都要进行相应修改。 因此虽然STJ∈3NF,但仍不是一个理想的关系模式。
4.2.4 BC范式(BCNF) 关系模式STJ出现上述问题的原因在于主属性J依赖于T,即主属性J部分依赖于码(S,T)。解决这一问题仍然可以采用投影分解法,将STJ分解为两个关系模式 ST(S,T) TJ(T,J) 其中ST的码为S,TJ的码为T。这两个关系模式的函数依赖如图4-7所示。 S T T J (a) ST (b) TJ
显然,在分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖。它解决了上述4个问题。显然,在分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖。它解决了上述4个问题。 ①ST关系中可以存储学生尚未选修课程的学生。TJ关系中可以存储所开课程尚未有学生选修的教师信息。 ②选修过某门课程的学生全部毕业了,只是删除,ST关系中的相应元组,不会影响TJ关系中相应教师开设该门课程的信息。 ③关于每个教师开设课程的信息只在TJ关系中存储一次。 ④某个教师开设的某门课程改名后,只需修改TL关系中的一个相应元组即可。 定义 4.9设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y⊈X,则X必含有候选码,那么R∈BCNF。 换句话说,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。 BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF更进了一步。通常认为BCNF是修正的第三范式,所以有时也称为第三范式。 显然关系模式ST和TJ都属于BCNF。可见,采用投影分解法将一个3NF的关系分解为多个BCNF的关系,可以在进一步解决原3NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
由BCNF的定义可以看到,每个BCNF的关系模式都具有如下3个性质。由BCNF的定义可以看到,每个BCNF的关系模式都具有如下3个性质。 ①所有非主属性都完全函数依赖于每个候选码。 ②所有主属性都完全函数依赖于每个不包含它的候选码。 ③没有任何属性完全函数依赖于非码的任何一组性。 如果关系模式R∈BCNF ,由定义可知,R中不存在任何属性传递依赖于或部分依赖于任何候选码,所以必定有R∈3NF。但是,如果R∈3NF,R未必属于BCNF。例如,前面的关系模式STJ∈3NF,但不属于BCNF。如果R只有一个候选码,则R∈3NF,R必属于BCNF。读者可以自己证明这一结论。 对于前面学生数据库中的三个关系模式: Student(Sno,Sname,Ssex,Sage,Sdept) Course(Cno,Cname,Cpno,Ccredit) SC(Sno,Cno,Grade) 在Student(Sno,Sname,Ssex,Sage,Sdept)中,由于学生有可能重名,因此它只有一个码Sno,且Sno是唯一的决定属性,所以Student∈BCNF。 在Course(Cno,Cname,Cpno,Ccredit)中,假设课程名称具有唯一性,则Cno和Cname均为码,这两个码都由单个属性组成,彼此不相交,在该关系模式中,除Cno和Cname外没有其他决定属性组,所以Course∈BCNF。
再来看一个例子。在关系模式SJP(S,J,P)中,S表示学生,J表示课程,P表示名次。每一个学生每门课程都有一个确定的名次,每门课程中每一名次只有一个学生。由这些语义可得到下面的函数依赖:再来看一个例子。在关系模式SJP(S,J,P)中,S表示学生,J表示课程,P表示名次。每一个学生每门课程都有一个确定的名次,每门课程中每一名次只有一个学生。由这些语义可得到下面的函数依赖: (S,J)→P (J,P)→S 所以(S,J)与(J,P)都是候选键。这两个候选码各由两个属性组成,而且相交。这个关系模式中显然没有属性对对候选码的传递依赖或部分依赖。而且除(S,J)和(J,P)外没有其他决定因素,所以SJP∈BCNF。 3NF和BCNF是以函数依赖为基础的关系模式规范化程度的测度。 如果一个关系数据库中的所有关系模式都属于3NF,则已在很大程度上消除了插入异常和删除异常,但由于可能存在主属性对候选码的部分依赖和传递依赖,因此关系模式的分离仍不够彻底。 如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常。
4.2.5 多值依赖与第四范式(4NF) 前面完全是在函数依赖的范畴内讨论关系模式的范式问题。如果仅考虑函数依赖这一种数据依赖,属于BCNF的关系模式已经很完美了。但如果考虑其他数据依赖,例如,多值依赖,属于BCNF的关系模式仍存在问题,不能算作是一个完美的关系模式。 例如,设学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。可以用一个关系模式Teach(C,T,B)表示课程C、教师T和参考书B之间的关系。假设该关系如图4-8所示。 图4-8 课程-教师-参考书之间的关系
Teach具有唯一候选码(C,T,B),即全码,因而Teach∈BCNF。但Teach模式中存在一些问题:Teach具有唯一候选码(C,T,B),即全码,因而Teach∈BCNF。但Teach模式中存在一些问题: ① 数据冗余度大:每一门课程的参考书是固定的,但在Teach关系中,有多少名任课教师,参考书就要存储多少次,造成大量的数据冗余。 ② 增加操作复杂:当某一课程增加一名任课教师时,该课程有多少本参考书,就必须插入多少个元组。例如,物理课增加一名任课教师刘关,需要插入两个元组: (物理,刘关,普通物理学),(物理,刘关,光学原理) ③ 删除操作复杂:某一门课要去掉一本参考书,该课程有多少名教师,就必须删除多少个元组。例如,数学课去掉《微分方程》书,需要删除两个元组: (数学,邓军,微分方程),(数学,陈斯,微分方程) ④ 修改操作复杂:某一门课要修改一本参考书,该课程有多少名教师,就必须修改多少个元组。 BCNF的关系模式Teach之所以会产生上述问题是因为参考书的取值和教师的取值是彼此独立毫无关系的,它们都只取决于课程名。也就是说,关系模式Teach中存在一种称之为多值依赖的数据依赖。
1. 多值依赖 定义 4.10设R(U)是一个属性集U上的一个关系模式,X,Y和Z是U的子集,并且Z=U-X-Y,多值依赖X→→Y成立当且仅当对R的任意关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。 若X→→Y,而Z=φ,则称X→→Y为平凡的多值依赖。否则称X→→Y为非平凡的多值依赖。 在Teach关系中,每个(C,B)上的值对应一组T值,而且这种对应与B无关。例如,(C,B)上的一个值(物理,光学原理)对应一组T值{李勇,王军},这组值仅仅决定于课程C上的值,也就是说对于(C,B)上的另一个值(物理,光学原理) ,它对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。因此T多值依赖于C,即C →→ T。 多值依赖也可以形式化地定义如下。 定义4.11在关系模式R(U)的任一关系r中,如果对于任意两个元组t,s,有t[X]=s[X],就必存在元组w,v∈r(w和v可以与s和t相同),使得w[X]=v[X]=t[X],而w[Y]= t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z],即交换s,t元组的Y值所得的两个新元组必在r中,则称Y多值依赖于X,记为X→→Y。其中,X和Y是U的子集,Z=U-X-Y。 定义4.11与定义4.11′完全等价。
多值依赖具有下列性质。 ①多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y。 例如,在关系模式Teach(C,T,B)中,已经知道C→→T。根据多值依赖的对称性,必然有C→→B。 多值依赖的对称性可以用图直观地表示出来。例如,可以用图4-9表示Teach(C,T,B)中的多值对应关系,其中对应C的某一个值Ci的全部T值记作{T}cj (表示教此课程的全体教师),全部B值记作{B}cj (表示此课程使用的所有参考书)。应当有{T}cj 中的每一个T值和{B}cj中的每一个B值对应。于是{T}cj 与{B}cj 之间正好形成一个完全二分图,因而C→→T。而B与T是完全对称的,因而必然有C→→B。
②多值依赖具有传递性。即若X→→Y,Y→→Z,则X→→Z-Y。 ③函数依赖可以看作是多值依赖的特殊情况。即若X→Y,则X→→Y。这是因为当X→Y时,对X的每一个值x,Y有一个确定的值y与之对应,所以X→→Y。 ④若X→→Y,X→→Z,则X→→YZ。 ⑤若X→→Y,X→→Z,则X→→Y∩Z。 ⑥若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y。 ⑦多值依赖的有效性与属性集的范围有关。如果X→→Y在U上成立,则在W(XY⊆W⊆U)上一定成立;但X→→Y在W(W⊂U)上成立,在U上并不一定成立。这是因为多值依赖的定义中不仅涉及属性组X 和Y,而且涉及U中其余属性Z。一般地,如果R的多值依赖X→→Y在W(W⊂U)上成立,则称X→→Y为R的嵌入型多值依赖。 但是函数依赖X→Y的有效性仅决定于X和Y这两个属性集的值,与其他属性无关。只要X→Y在属性集W上成立,则X→Y在属性集U(W⊂U)上必定成立。 ⑧若多值依赖X→→Y在R(U)上成立,对于Y′⊂Y,并不一定有X→→Y′成立。但是如果函数依赖X→Y在R上成立,则对于任何Y′⊂Y均有X→Y′成立。
2.第四范式(4NF) 定义4.12关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y⊈X),X都含有候选码则R∈4NF。 4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。因为根据定义,对于每一个非平凡的多值依赖X→→Y(Y⊈X),X都含有候选码,于是当然X→Y,所以4NF所允许的非平凡多值依赖实际上是函数依赖。 显然,如果一个关系模式是4NF,则必为BCNF。 前面讨论的关系模式Teach中存在非平凡的多值依赖C→→T,且C不是候选码,因此Teach不属于4NF。这正是它之所以存在数据冗余度大,插入和删除操作复杂等弊病的根源。可以用投影分解法把Teach分解为如下两个4NF关系模式以减少数据冗余: CT(C,T) CB(C,B) CT中虽然有C→→T,但这是平凡多值依赖,即CT中已不存在既非平凡也非函数依赖的多值依赖。所以CT属于4NF。同理,CB也属于4NF。分解后Teach关系中的几个问题可以得到解决。 ① 参考书只需要在CB关系中存储一次。 ② 当某一课程增加一名任课教师时,只要在CB关系中增加一个元组。 ③ 某一门课要去掉一本参考书,只需要在CB关系中删除一个相应的元组。
函数依赖和多值依赖是两种最重要的数据依赖。如果只考虑函数依赖,则属于BCNF的关系模式已经很完美了。事实上,数据依赖中除函数依赖和多值依赖之外,还有一种连接依赖。函数领带是多值依赖的一种特殊情况,而多值依赖实际上又是连接依赖的一种特殊情况。但连接依赖不像函数依赖和多值依赖可由语义直接导出,而是在关系的连接运算时才反映出来。存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。如果消除了属于4NF的关系模式中存在的连接依赖,则可以进一步投影分解为5NF的关系模式。到目前为止,5NF是最终范式。这里不再详细讨论连接依赖和5NF,有兴趣的读者可以参阅有关书籍。函数依赖和多值依赖是两种最重要的数据依赖。如果只考虑函数依赖,则属于BCNF的关系模式已经很完美了。事实上,数据依赖中除函数依赖和多值依赖之外,还有一种连接依赖。函数领带是多值依赖的一种特殊情况,而多值依赖实际上又是连接依赖的一种特殊情况。但连接依赖不像函数依赖和多值依赖可由语义直接导出,而是在关系的连接运算时才反映出来。存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。如果消除了属于4NF的关系模式中存在的连接依赖,则可以进一步投影分解为5NF的关系模式。到目前为止,5NF是最终范式。这里不再详细讨论连接依赖和5NF,有兴趣的读者可以参阅有关书籍。