1、定义 设F是关系模式R的函数依赖集 ρ={R 1<U 1,F 1>, R 2<U 2,F 2>,…,R k<U k,F k>} 是R的一个分解, 如果R的满足F的任一个关系r均有:r=mρ(r), 则称分解ρ具有无损联接性。 2、引理 设ρ={R1<U1,F1>, R2<U2,F2>,…,Rk<Uk,Fk>} 为关系模式R的一个分解,r为R的任一个关系,ri=πUi(r), 则: ① r≤mρ(r)(表r包含于mρ(r)) ② 如果s=mρ(r) ,则πUi(s)=ri ③ mρ(mρ(r))=mρ(r) 证: ①设t为关系r的任一元组,ti=t[ui]∈ri(i=1,2,…,k), 根据自然连接的定义,t1,t2,…,ti∈πUi(r),即t∈mρ(r), 所以有r≤mρ(r)(表包含于mρ(r))。 ②、③的证明参看P121。 结论:分解后的关系做自然联接必包含分解前的关系, 即分解不会丢失信息,但可能增加信息, 只有r=mρ(r)时,分解才具有无损联接性。 例4.4.2:设ρ(r),由此可得到什么结论? 解:
结论:分解不具有无损联接性。 3、为什么要进行关系分解 一个关系模式分解后,可以存放原来所不能存放的信息, 通常称为“悬挂”的元组,这是实际所需要的,正是分解的优点。 在做自然联接时,这类悬挂元组自然丢失了, 但不是信息的丢失,而是合理的。 4、检验分解无损联接性的算法 设有关系模式R(A1,A2,…,An), F为它的函数依赖集, ρ={R1,R2,…,Rk}为R的一个分解。 算法: (1)构造初始表: 构造一个k行n列的初始表,其中每列对应于R的一个属性, 每行用于表示分解后的一个模式组成。 如果属性Aj属于关系模式Ri, 则在表的第一i行第j列置符号aj, 否则置符号bij 。 (2)根据F中的函数依赖修改表内容: 考察F中的每个函数依赖X→Y,在属性组X所在的那些列上 寻找具有相同符号的行,如果找到这样的两行或更多的行, 则修改这些行,则使这些行上属性组Y所在的列上元素相同。 修改规则是:如果y所在的要修改的行中有一个为aj, 则这些元素均变成aj;否则改动为bmj(其中m为这些行的最小行号)。 注意:若某个bij被改动,则该列中凡是与bij相同的符号均做相同的改动。 循环地对F中的函数依赖进行逐个处理,直到发现表中有一行 变为a1,a2,…an或不能再被修改为止。 (3)判断分解是否为无损联接: 如果通过修改,发现表中有一行变为a1,a2,…an, 则分解是无损联接的,否则分解不具有无损联接性。 算法实现: 输入:关系R上的属性集U={A1,A2,…,Ak} , R上的函数依赖集F, R的分解ρ={R1,R2,…,Rk}。 输出:如果ρ为无损分解则为真,否则为假。 Lossless(R,F,ρ) { 构造初始表Rρ change=真; while (change) { for (F中的每个函数依赖X→Y) { if(Rρ中ti1[X]=ti2[X]=…=tim[X]) {将ti1[Y],ti2[Y]=,…,tim[Y]改为相同} if (Rρ中有一行为a1,a2,…an) {return 真;} } if (修改后的表Rρ=修改前的表Rρ ) {chang=假;} } if (Rρ中有一行为a1,a2,…an){return 真;} else {return 假;} } 例4.4.3:关系模式R(SAIP),F={S→A,SI→P},ρ={R1(SA),R2(SIP)}, 检验分解是否为无损联接。 通过修改发现表中第二行元素变为a1,a2,…,an,分解是无损联接。
例4.4.4:已知关系模式R(ABCDE)及函数依赖集F={A→C,B→C,C→D,DE→C,CE→A} 验证分解ρ={R1(AD),R2(AB),R3(BE),R4(CDE),R5(AE)}是否为无损联接。 通过修改发现表中第三行元素变为a1,a2,…,an,分解是无损联接。 练习4.4.1: 已知关系模式R(U,F) , U={SNO,CNO,GRADE,TNAME,TAGE,OFFICE}, F={(SNO,CNO)→GRADE,CNO→TNAME,TNAME→(TAGE,OFFICE)}, 以及R上的两个分解 ρ1={SC,CT,TO}, ρ2={SC,GTO}, 其中SC={SNO,CNO,GRADE},CT={CNO,TNAME},TO={TNAME,TAGE,OFFICE}, GTO={GRADE,TNAME,TAGE,OFFICE}。 试检验ρ1,ρ2的无损联接性。 答案: ρ1是无损分解,ρ2不是无损分解。 5、定理4.4.1 检验分解无损联接性的算法,能够正确判定一个分解 是否具有无损联接性。(证明:参看课本P124) 6、定理4.4.2 设ρ={R1, R2}是关系模式R的一个分解,F是R的函数依赖集, 那么ρ是R(关于F)的无损分解的充分必要条件是: (R1∩R2)→R1-R2∈F+ 或 (R1∩R2)→R2-R1∈F+ (证明:参看课本P124) 例4.4.5:关系模式R(SAIP),F={S→A,SI→P},ρ={R1(SA),R2(SIP)} 检验分解是否为无损联接? 解:R1∩R2=SA∩SIP=S R1-R2=SA-SIP=A,S→A∈F,所以ρ是无损分解。 7、定理4.4.3(逐步分解定理——关系模式可以逐步进行分解) 设F是关系模式R的函数依赖集,ρ={R1,R2,…,Rk}是R关于F的一个无损联接。 分解: (1)若σ={S1,S2,…,Sm}是Ri关于Fi的一个无损联接分解,则 ε={R1,…,Ri-1,S1,S2,…,Sm,Ri+1,…,Rk}是R关于F的无损联接分解。 其中Fi=πRi(F)。 (2)设τ={R1,…,Rk,Rk+1,…,Rn}是R的一个分解,其中τ≥ρ(表τ包含ρ) , 则τ也是R关于F的无损联接分解。
有关系模式R(A,B,C), ρ={R1,R2}为它的一个分解, 其中R1=AB,R2=BC,r为R的一个关系,r1=πR1(r),r2=πR2(r), 求r1,r2,m |
1、定义 设F是关系模式R的函数依赖集, ρ={R1<U1,F1>, R2<U2,F2>,…, Rk<Uk,Fk>}为R的一个分解, 如果Fi=πRi(F)的并集(F1∪F2∪…∪Fk)≡F(i=1,2,…,k) 则称分解ρ具有函数依赖保持性。
2、例题与练习 例4.4.6:将R=(ABCD,{A→B,B→C,B→D,C→A})分解为 关于U1=AB,U2=ACD两个关系,求R1、R2, 并检验分解的无损联接性和分解的函数依赖保持性。 解:F1=πR1(F)={A→B,B→A}, F2=πR2(F)={A→C,C→A,A→D} R1=(AB,{A→B,B→A}) R2=(ACD,{A→C,C→A,A→D}) U1∩U2=AB∩ACD=A, U1-U2=AB-ACD=B,A→B∈F, 所以ρ是无损分解; F1UF2={A→B,B→A,A→C,C→A,A→D}≡{A→B,B→C,B→D,C→A}=F 所以ρ是函数依赖保持性。 例4.4.7:关系模式R(A,B,C,D) 函数依赖集F={A→B,C→D},ρ={R1(AB),R2(CD)} 求R1,R2 ,并检验分解的无损联接性和分解的函数依赖保持性。 解:F1=πR1(F)={A→B}, F2=πR2(F)={C→D} R1(AB,{A→B}), R2(Cd,{C→D}) U1∩U2=AB∩CD=Φ, U1-U2=AB, U2-U1=CD, Φ→ABF, Φ→CDF, 所以ρ不是无损分解。 练习4.4.2:已知关系模式R(CITY,ST,ZIP), F={(CITY,ST)→ZIP,ZIP→CITY} 以及R上的一个分解ρ={R1, R2}, R1 ={ST,ZIP}, R2 ={CITY,ZIP} 求R1,R2 ,并检验分解的无损联接性和分解的函数依赖保持性。 答案:R1=({ST,ZIP},{Φ}) R2=(CITY,ZIP,{ZIP→CITY}) ρ是无损分解,但不具有函数依赖保持性。 |