您好,欢迎访问三七文档
数据库系统原理1陈岭浙江大学计算机学院关系模型2BCNF3NF多值依赖4NF数据库设计过程BCNF、3NF和4NFBoyce-Codd范式3具有函数依赖集合F的关系模式R属于BCNF的条件是,当且仅当对F+中所有函数依赖(其中,R且R),下列至少有一项成立是平凡的函数依赖(即)是R的超码(即,R+,R)Boyce-Codd范式4例,R=(A,B,C)F={ABBC}键={A}R不属于BCNF(∵F+={AB,BC,AC,…},因为BC,B不是超码)分解成R1=(A,B),R2=(B,C)R1与R2属于BCNF(A是R1的超码,B是R2的超码)无损连接分解(R1R2=B,并且B是R2的超码)保持依赖(F1={AB}在R1上保持依赖,F2={BC}在R2上保持依赖)检查是否为BCNF5为检查非平凡依赖是否违反BCNF的要求计算+检验+是否包含R的所有属性,即,是否为R的超码简化的测试:为检查具有函数依赖集合F的关系模式R是否属于BCNF,只需检查F中的函数依赖是否违反BCNF即可,而不需检查F+中的所有函数依赖可以证明如果F中没有违反BCNF的依赖,则F+中也没有违反BCNF的依赖∵F+是由Armstrong的3个公理从F推出的,而任何公理都不会使FD左边变小(拆分),故如果F中没有违反BCNF的FD(即左边是superkey),则F+中也不会检查是否为BCNF6但是,当检查R的分解后的关系时仅用F是错误的例,考虑R(A,B,C,D),具有F={AB,BC}分解R到R1(A,B)与R2(A,C,D)F中的函数依赖都不是只包含(A,C,D)中的属性,因此我们可能错误地认为R2满足BCNF事实上,F+中的依赖AC显示R2不属于BCNF可在F下判别R是否违反BCNF,但须在F+下判别R的分解式是否违反BCNFBCNF分解算法7result:={R};done:=false;computeF+;while(notdone)doif(result中存在模式Ri不属于BCNF)thenbegin令是Ri上的一个非平凡函数依赖使得Ri不属于F+,且=;result:=(result–Ri)(Ri–)(,);endelsedone:=true;注意:每个Ri都属于BCNF,且分解是无损连接的将Ri分解为二个子模式:Ri1=(,)和Ri2=(Ri–),是Ri1和Ri2的共同属性Ri1Ri2BCNF分解示例8class(course_id,title,dept_name,credits,sec_id,semester,year,building,room_number,capacity,time_slot_id)函数依赖:course_id→title,dept_name,creditsbuilding,room_number→capacitycourse_id,sec_id,semester,year→building,room_number,time_slot_id候选码:{course_id,sec_id,semester,year}BCNF分解:course_id→title,dept_name,credits,但是course_id不是超码BCNF分解示例9我们将class分解为:―course(course_id,title,dept_name,credits)―class-1(course_id,sec_id,semester,year,building,room_number,capacity,time_slot_id)course是BCNFbuilding,room_number→capacity在class-1上存在依赖,但是{building,room_number}不是class-1的超码我们将class-1分解为:―classroom(building,room_number,capacity)―section(course_id,sec_id,semester,year,building,room_number,time_slot_id)classroom和section是BCNFBCNF与保持依赖10BCNF分解不总是保持依赖的例,R=(J,K,L)F={JKLLK}两个候选码:JK和JLR不属于BCNF(∵LK,L不是超码)R的任何分解都不满足保持依赖:JKL例,R1=(L,K),R2=(J,L)BCNF,但不保持依赖J---student,K---course,L---teacher(一门课有多个教师,一个教师上一门课,一个学生选多门课,一门课有多个学生选)BCNF与保持依赖11因此,我们并不总能满足这三个设计目标:无损连接BCNF保持依赖3NF:动机12存在这样的情况BCNF不保持依赖但是,有效检查更新是否违反FD是重要的解决方法:定义一种较弱的范式,称为第三范式(3NF)允许出现一些冗余(从而会带来一些问题)但FD可以在单个关系中检查,不必计算连接总是存在到3NF的无损连接分解,且是保持依赖的3NF13关系模式R属于第三范式(3NF)当且仅当对所有F+中的函数依赖下列条件中至少一个成立:是平凡的函数依赖(即,)是R的超码–中的每个属性A都包含于R的一个候选码中(即A–是主属性,若=,则A=是主属性)注:各属性可能包含在不同候选码中3NF14若一个关系属于BCNF则必属于3NF第三范式相对于BCNF来说放宽了约束,允许非平凡函数依赖的左面不是超码。因为候选码是最小的超码,它的任何一个真子集都不是超码第三个条件是对BCNF条件的最小放宽,以确保每一个模式都有保持依赖的3NF分解讨论:国内其他教材关于3NF的定义:不存在非主属性对码的部分依赖和传递依赖。该定义实际是说,当为非主属性时,必须是码;但当为主属性时,则无限制。二种定义本质上是一致的3NF15例,R=(J,K,L)F={JKL,LK}两个候选码:JK和JLR属于3NFJKL,JK是超码LK,K包含在一候选码中但BCNF分解将得到(J,L)和(L,K),JKL不保持依赖检查JKL,需要连接操作此模式中存在冗余J---student,K---course,L---teacher(一门有多个教师,一个教师上一门课,一个学生选多门课,一门课有多个学生选)BCNF与3NF的比较16因3NF的冗余引起的问题R=(J,K,L)F={JKL,LK}J---student,K---course,L---teacher(一门有多个教师,一个教师上一门课,一个学生选多门课,一门课有多个学生选)Jj1j2j3nullLl1l1l1l2Kk1k1k1k2属于3NF但不属于BCNF的模式存在以下问题:信息重复(如,联系l1和k1)需要使用空值(如,表示联系l2和k2,这里没有对应的J值)检查是否为3NF17优化:只需检查F中的FD,而不必检查F+中的所有FD对每个依赖,利用属性闭包来检查是否为超码如果不是超码,必须检查中的每个属性是否包含在R的某个候选码中这个检查较昂贵,,因为它涉及求候选码检查是否属于3NF是NP-hard的有趣的是,分解到第三范式可以在多项式时间内完成3NF分解算法18令Fc是F的正则覆盖;i:=0;foreachFc中的函数依赖do{if没有模式Rj(1ji)包含thenbegini:=i+1;Ri:=(,)end}if没有模式Rj(1ji)包含R的候选码thenbegini:=i+1;Ri:=R的任意候选码;endreturn(R1,R2,...,Ri)保证至少在一个Ri中存在R的候选码,从而保证lossless-join将Fc中的每个分解为子模式Ri:=(,),从而保证dependency-preserving3NF示例19关系模式:cust_banker_branch=(customer_id,employee_id,branch_name,type)函数依赖:customer_id,employee_idbranch_name,typeemployee_idbranch_namecustomer_id,branch_nameemployee_id计算正则覆盖:branch_name在第一个函数依赖中是多余的没有其他的多余属性,因此,我们得到FC=―customer_id,employee_idtype―employee_idbranch_name―customer_id,branch_nameemployee_id3NF示例20通过for循环,我们得到以下子关系模式:(customer_id,employee_id,type)(employee_id,branch_name)(customer_id,branch_name,employee_id)由于(customer_id,employee_id,type)包含原关系模式的候选码,分解到此为止在循环结束后,检查并删除模式。如,(employee_id,branch_name)是其他模式的子集,应该删除结果与考虑函数依赖的顺序无关3NF示例21最后,得到3NF分解的子关系模式:(customer_id,employee_id,type)(customer_id,branch_name,employee_id)BCNF与3NF的比较22总是可以将一个关系分解到3NF并且满足分解是无损的保持依赖总是可以将一个关系分解到BCNF并且满足分解是无损的但可能不保持依赖练习23例1,F={ABE,BEI,EG,GIH},使用Armstrong公理证明ABGH证明:ABE,由增补率得:ABBE;BEI,由增补率得:BEEI;∴ABEI----(1)EG,由增补率得:EIGI;GIH,由增补率得:GIGH∴EIGH----(2)∴(1),(2)通过传递律得:ABGH练习24例2,对于关系模式:R(A,B,C,D),F={ABC,CD,DA}1)列出R的所有候选码2)将R分解为到BCNF3)上述分解是否为保持依赖的答:1)(AB)+=(ABCD)R,(BC)+=(ABCD)R,DA,BDAB;ABC;∴(BD)+=(ABCD)R,∴AB,BC,BD是候选码,且R不满足BCNF2)R1(C,D);R2(A,B,C),(R1满足BCNF,R2不满足BCNF,∵CD,DA,∴CA,C不是R2的超码);R21(A,C),R22(B,C),R21满足BCNF,R22满足BCNF3)DA,ABC不是保持依赖的ABCD练习25例3,对于关系模式:R(A,B,C,D,E,F),F={AB,AC,BCA,DEF,FE}1)列出R的所有候选码2)R属于BCNF还是3NF,或都不属于3)如果R不属于BCNF,将其分解到BCNF4)上述分解是否为保持依赖的答:1)候选码为:AD,BCD2)∵FE,F不是超码,E不在超码中,不属于BCNF,也不属于3NF3)R1=(A,B,C),R2=(A,D,E,F),(由ABC)R21=(D,E,F),R22=(A,D),∵FE,R21不属于BCNF,R211=(F,E),R212=(D,F)ABCDEF练习26答:3)方法2:R1=(B,C,A),R2=(B,C,D,E,F);R21=(F,E),R22=(B,C,D,F),R221=(D,F),R222=(B,C,D)4)DE是保持依赖吗?练习27例4,对于关系模式:R(A,B,C,D,E),
本文标题:数据库第十章
链接地址:https://www.777doc.com/doc-3990084 .html