数据库 无损连接分解

无损连接分解的形式定义如下:设R是一个关系模式,F是R上的一个函数依赖(FD)集。R分解成数据库模式δ={R1,……,Rk}。如果对R中每一个满足F的关系r都有下式成立:

  那么称分解δ相对于F是“无损连接分解”,否则称为“损失连接分解”。其中表示自然连接。

  从上述形式定义中可知,若直接根据定义来判断某个分解是否具有无损连接性,那么就得“对R中每一个满足F的关系r”进行测试,看是否满足上面的等式,这显然不可操作,因为“对R中每一个满足F的关系r”进行测试就意味着“对R中所有满足F的关系r”进行测试,显然是不可能的。这里所说的“关系”就是指一张具体的表。

  因此,必须寻求其它的可操作性方法来判别分解的无损连接性。

  2. 无损连接分解的普通判别方法——表格法

  设关系模式R=A1,…,An,R上成立的FD集F,R的一个分解p={R1,…,Rk}。无损连接分解的判断步骤如下:

  (1)构造一张k行n列的表格,每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri(1≤i≤k)。如果Aj在Ri中,那么在表格的第i行第j列处填上符号aj,否则填上符号bij。

  (2)把表格看成模式R的一个关系,反复检查F中每个FD在表格中是否成立,若不成立,则修改表格中的元素。修改方法如下:对于F中一个FD:X→Y,如果表格中有两行在X分量上相等,在Y分量上不相等,那么把这两行在Y分量上改成相等。如果Y的分量中有一个是aj,那么另一个也改成aj;如果没有aj,那么用其中的一个bij替换另一个(尽量把ij改成较小的数,亦即取i值较小的那个)。

  若在修改的过程中,发现表格中有一行全是a,即a1,a2,…,an,那么可立即断定p相对于F是无损连接分解,此时不必再继续修改。若经过多次修改直到表格不能修改之后,发现表格中不存在有一行全是a的情况,那么分解就是有损的。特别要注意,这里有个循环反复修改的过程,因为一次修改可能导致表格能继续修改。

  修改过程中要特别注意,若某个bij被改动,那么它所在列的所有bij都需要做相应的改动。为了明确这一点,举例说明。例如,我们根据FD“H→I”、“
K→L”来修改表格之前时的表格如表1所示(已经过多次修改,非初始表,空的单元表示省略):

  表1

 
H

I

J

K

L

R1
 
b12
   
b35

R2

a1

a2
 
a4

b25

R3

a1

b12
 
a4

b35

R4
 
b12
   
b35

  R2、R3所在行的H分量都为a1,根据FD“H→I”,需要修改这两行对应的I分量,而R2所在行的I分量为a2,因此,要将R3所在行的I分量b12修改为a2,注意到,R1、R4所在行的H分量也为b12,因此,这两行对应的I分量也必须修改为a2。R2、R3所在行的K分量都为a4,根据FD“K→L”,需要修改这两行对应的L分量,于是将R3所在行的L分量b35修改为较小的b25,同时注意到,R1、R4所在行的L分量也为b35,因此,这两行对应的L分量也必须修改为b25。修改后的表格如表2所示:

  表2

 
H

I

J

K

L

R1
 
a2
   
b25

R2

a1

a2
 
a4

b25

R3

a1

a2
 
a4

b25

R4
 
a2
   
b25

  【例题】(软件设计师2002年上午试题38)

  设关系模式 R为 R(H,I,J,K,L),R上的一个函数依赖集为 F={H→J,J→K,I→J,JL→H},分解 (38)
是无损连接的。

  供选择的答案:

  (38) A. p={HK,HI,IJ,JKL,HL} B. p={HIL,IKL,IJL}

  C. p={HJ,IK,HL} D. p={HI,JK,HL}

  试题分析:

  根据上述判断方法,我们列出选项B(分解成三个关系模式R1(HIL)、R2(IKL)、R3(IJL) )的初始表如表3所示:

  表3 选项B的初始表

  H I J K L
HIL a1 a2 b13 b14 a5
IKL b21 a2 b23 a4 a5
IJL b31 a2 a3 b34 a5

  对于函数依赖集中的H→J、J→K对表3进行处理,由于属性列H和属性列J上无相同的元素,所以无法修改。但对于I→J在属性列I上对应的1、2、3行上全为a2元素,所以,将属性列J的第一行b13和第二行b23改为a3。修改后如表4所示:

表4 选项B的中间表

  H I J K L
HIL a1 a2 a3 b14 a5
IKL b21 a2 a3 a4 a5
IJL b31 a2 a3 b34 a5

  对于函数依赖集中的JL→H在属性列J和L上对应的1、2、3行上为a3、a5元素,所以,将属性列H的第二行b21和第三行b31改为a1。修改后如表5所示:

  表5 选项B的结果表

  H I J K L
HIL a1 a2 a3 b14 a5
IKL a1 a2 a3 a4 a5
IJL a1 a2 a3 b34 a5

  从表5可以看出,第二行为a1、a2、a3、a4、a5,所以分解p是无损的。

  有一种特殊情况要注意:分解后的各个关系模式两两均无公共属性。由于是模式分解,那么任一一个分解后的关系模式覆盖的属性集不可能是分解前的整个全部属性U,因此初始表中不存在全是a的行。又注意到,分解后的各个关系模式两两均无公共属性,表明任两行在任一列上都没有相同的分量,这导致整个表格无法修改,保持初始状态。而初始状态不存在全是a的行,因此这种特殊情况的分解是有损的。

  例如,函数依赖集合FD,将关系模式R(ABCDEF)分解成R1(AB)、R2(CDE)、R3(F),那么这种分解肯定是有损的。考试中可能碰到这种情况,那么一眼就可以判断出结果,从而节省了时间。

  3. 无损连接分解的快捷判别方法

  首先要申明,这种快捷方法是有前提的,前提就是分解后的关系模式只有两个。其内容为:

  设ρ={R1,R2}是R的一个分解,F是R上的FD集,那么分解ρ相对于F是无损分解的充分必要条件是:(R1∩R2)→(R1–R2)或(R1∩R2)→(R2–R1)。这个“或”字很重要,这里表示(R1∩R2)→(R1–R2)、(R1∩R2)→(R2–R1)中只要有一个成立就行。这里的求交和相减运算的对象是关系模式的属性。

  【例题】

  关系模式R(U,F),其中U={W,X,Y,Z},F={WX→Y,W→X, X→Z,Y→W}。那么下列分解中是无损分解的是 。

  供选择的答案:

  A.p={R1(WY),R2(XZ)} B.p={R1(WZ),R2(XY)}

  C.p={R1(WXY),R2(XZ)} D.p={R1(WX),R2(YZ)}

  试题分析:

  A选项,R1∩R2为空,肯定不满足条件。

  B选项,R1∩R2为空,肯定不满足条件。

  C选项,R1∩R2={X},R1-R2={WY},R2-R1={Z},根据函数依赖集,X→Z成立,所以满足条件。

  D选项,R1∩R2为空,肯定不满足条件。

  4. 总结

  模式分解无损性判别的源泉仍然是普通的表格法。这种快捷方法只不过是根据这种表格法推断出来的而已,是它的一个特列。但是这种快捷方法却往往非常有用。

时间: 2024-12-25 22:05:47

数据库 无损连接分解的相关文章

软考数据库-无损联接分解

定义:无损联接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损联接分解. 可还原 例1:关系模式:成绩(学号,姓名,课程号,课程名,分数) 函数依赖:学号->姓名,课程号->课程名, (学号,课程号)->分数 若将其分解为下面三个关系模式: 成绩(学号,课程号,分数) 学生(学号,姓名) 课程(课程号,课程名) 问,这样的分解是无损分解么? ---- 由于:学号->姓名,所以: 成绩(学号,课程号,分数,姓名) 由于:

[转载]快捷判断无损连接

原理:如果在F中有(R1 ∩ R2)->(R1 - R2)或者(R1 ∩ R2)->(R2 - R1)其中之一,那么分解R1和R2就是无损连接的 实例: R(A,B,C,D,E),R的函数依赖集F={A->BC,CB->E,B->D,E->A}. 判断R1(A,B,C),R2(A,D,E)是否是无损连接. 因为只有两个关系模式,所以可以用快捷方式来判断. R1 ∩ R2={A},R1 - R2={B,C},因为F中有A->BC,即有(R1 ∩ R2)->(R

数据库求闭包,求最小函数依赖集,求候选码,判断模式分解是否为无损连接,3NF,BCNF

1.说白话一点:闭包就是由一个属性直接或间接推导出的所有属性的集合. 例如:f={a->b,b->c,a->d,e->f}:由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d} 2. 候选码的求解理论和算法 对于给定的关系R(A1,A2,-An)和函数依赖集F,可将其属性分为4类: L类  仅出现在函数依赖左部的属性. R 类  仅出现在函数依赖右部的属性. N 类  在函数依赖左右两边均未出现的属性. LR类  在函数依赖左右两边均出现的属性. 定理:对于给定的关系

分解成3NF保持函数依赖且为无损连接的算法

分解成3NF保持函数依赖且为无损连接的算法: 1.根据分解成3NF的保持函数依赖的分解算法(http://www.cnblogs.com/bewolf/p/4443919.html),得到分解结果ρ 2.判断分解是否为无损连接,如果是直接输出结果ρ 3.如果2中是有损的,那么令ρ=ρU{X},其中X是R的码,然后输出ρ.

模式分解是否为无损连接的判断方法

方法一:无损连接定理 关系模式R(U,F)的一个分解,ρ={R1<U1,F1>,R2<U2,F2>}具有无损连接的充分必要条件是: U1∩U2→U1-U2 €F+ 或U1∩U2→U2 -U1€F+ 方法二:算法 ρ={R1<U1,F1>,R2<U2,F2>,...,Rk<Uk,Fk>}是关系模式R<U,F>的一个分解,U={A1,A2,...,An},F={FD1,FD2,...,FDp},并设F是一个最小依赖集,记FDi为Xi→Al

jsp_数据库的连接

一.添加数据库以及表 在这里我们使用的是mysql数据库 二.配置数据库的驱动程序 将mysql的驱动程序复制到Tomcat目录下的lib目录中 注:在Tomcat中如果配置了新的jar包,则配置完成后一定要重新启动服务器. 三.在jsp文件中获取数据库的连接,并将前面创建的表的数据显示出来 1 <%@ page contentType="text/html; charset=utf-8" language="java" import="java.s

SQL Server 断开某个数据库所有连接(还原的时候需要)

问题描述: SQL Server数据库备份还原后,在数据库名称后会出现"受限制访问"字样 解决办法: 右键点击数据库 -> 属性 -> 选项 -> 状态 -> 限制访问 -> 选择Multiple -> 确定. 问题描述: 在对SQL Server数据库进行还原时,提示:System.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权.(Microsoft.SqlServer.Smo).出现此问题的原

安装DiscuzX3.2遇到数据库不能连接的问题

最近帮朋友安装DiscuzX3.2,遇到了数据库不能连接的问题: Access denied for user 'root'@'localhost' (using password: NO) 已经正确填好数据库用户和密码了呀?而且通过该用户(root)登录数据库是没有问题的,但是为啥就是连接不上呢?貌似是php连接mysql时出现了问题. 查找良久,各种尝试. 后来无意中看到一个贴子里有提到php安全模式的字眼,于是乎查看php.ini,的确是设置为了On,需要设置成sql.safe_mode

PHP前端和数据库的连接

连接数据库(传统的方法) mysql_connect("lcoalhost","root",""); //连接本机数据库,连接外机localhost可以改成制定ip地址 mysql_select_db("txst",$db); //选择要操作的数据库 $sql="select * from info"; //书写MySQL语句 $result=mysql_query($sql); //执行MySQL语句 v