保持函数依赖分解
将一个关系模式按函数依赖进行分解,分解后该模式的函数依赖仍然成立。
例如:
关系内不存在冗余
关系R(A,B,C)中,有A、B、C三个属性
依赖关系是:A-->B ; B-->C;
如果划分为 R1(A,B);R2(B,C)则称之为保持函数依赖划分;
关系内存在冗余
关系R(A,B,C)中,有A、B、C三个属性
依赖关系是:A-->B ; B-->C ; A-->C;
由A-->B ; B-->C ;可知A-->C;所以A-->C;是关系冗余
如果划分为 R1(A,B);R2(B,C)则依然称之为保持函数依赖划分;
无损分解
有损分解:
是不能还原的,例如将一张照片压缩为jpj格式,此时放大看照片会模糊,这便是有损压缩;
无损分解:
是可以还原的,例如将文件压缩成压缩包,然后解压之后还能得到原来的文件,这便是无损分解;
无损联接分解:
将一个关系模式分解成若干个关系模式之后,通过自然联接和投影等运算仍能还原到原来的关系模式。
例:
有关系模式
成绩(学号,姓名,课程号,课程名,分数);
函数依赖:学号→姓名,课程号→课程名,(学号,课程号)→分数
若将其分解为
成绩(学号,课程号,分数)
学生(学号,姓名)
课程(课程号,课程名)
思考此分解是否为无损分解
思路:
由于关系:学号→姓名,可以将两个带有学号属性的关系进行连接
成绩(学号,课程号,分数) 联接 学生(学号,姓名)
得到 成绩(学号,课程号,分数,姓名)
由于关系:课程号→课程名,可以将两个带有课程号属性的关系进行连接
成绩(学号,课程号,分数,姓名)联接 课程(课程号,课程名)
得到 成绩(学号,姓名,课程号,课程名,分数)即可以恢复到原来关系
方法一:列表
首行表示原有关系 成绩(学号,姓名,课程号,课程名,分数)
下面三行分别表示原有关系分成了成绩、学生、课程三个子关系
a表示在此行对应的子关系中存在该属性;b表示在此子关系中对应的属性不存在,a的下标是列号,b的下标是行号列号。
例如:成绩行中的内容表示子关系成绩(学号,课程号,分数)
根据成绩(学号,课程号,分数)关系 联接 学生(学号,姓名)关系
得到 成绩(学号,课程号,分数,姓名),如下图所示:
再根据上述成绩(学号,课程号,分数,姓名)联接 课程(课程号,课程名)
得到 成绩(学号,姓名,课程号,课程名,分数)如下图所示:
由上图可知,成绩一行已经全部为a,即代表可以恢复到原来关系,即本次分解为无损分解。
方法二:计算
此方法十分高效但是具有很强的局限性,只能用于将一个关系一分为二,一分为三则不适用。
例题
题目意思是,有关系R中存在三个属性A、B、C;将这三个属性分别按照ρ1,ρ2两种方法进行分解,ρ1中将其分为R1,R2两个关系R1中包含属性A、B;R2中包含属性A、C;
按照上述定理
分解方式ρ1
R1∩R2=A;R1-R2=B;R2-R1=C;
R1∩R2 → (R1-R2) = A→B(得到依赖关系A→B);
R1∩R2 → (R2-R1) = A→C(得到依赖关系A→C);
依赖关系A→B与A→C只要能有一个在题目给定得原始关系中存在过则说明是无损分解。
依赖关系A→B与A→C能够对应题目中的A→B,因此分解方式ρ1是无损分解
同理分解方式ρ2
R1∩R3=B;R1-R3=A;R3-R1=C;
R1∩R3 → (R1-R3) = B→A(得到依赖关系 B→A);
R1∩R3 → (R3-R1) = B→C(得到依赖关系B→C);
依赖关系B→A与B→C只要能有一个在题目给定得原始关系中存在过则说明是无损分解。
依赖关系B→A与B→C均无法对应题目中的A→B因此分解方法ρ2不是无损分解是有损分解。