📅  最后修改于: 2020-12-13 05:30:23             🧑  作者: Mango
算法:测试无损(非累加)连接属性。
输入:一种通用关系R,分解d = R的{R1,R2,R3,… ..室},和函数依赖的一组F。
1.具有一个行i用于在d日每个关系,以及用于R各自属性AJ一个列j创建一个初始矩阵S。
2.为所有矩阵项设置S(i,j):= bij。 (*每个bij是一个与索引(i,j)相关的不同符号*)
{for each column j representing attribute Aj
{if (relation Ri includes attribute Aj ) then set S(I, j):=aj;};};
(* each aj is a distinct symbol associated with index (j) *)
3.对于每个行i表示关系模式日
{for each functional dependency X → Y in F
{for all rows in S which have the same symbols in the columns
corresponding to attributes in X
{make the symbols in each column that correspond to
an attribute in Y be the same in all these rows as
follows: if any of the rows have an "a" symbol for the
the column set the other rows to that same "a" symbol
the column. If no "a" symbol exists for the attribute
in any of the rows, choose one of the "b" symbols
that appear in one of the rows for the attribute and set
the other rows to that same "b" symbol in the
column ;};};};
4.重复以下循环,直到执行完完整的循环后,S不变。
5.如果一行完全由“ a”符号组成,则分解具有无损连接属性;否则,它会
问题1.给定一个关系模式R = {SSN,ENAME,PNUMBER,PNAME,PLOCATION,HOURS}和分解表R1 = {ENAME,PLOCATION}和R2 = {SSN,PNUMBER,HOURS,PNAME,PLOCATION}和FD = {SSN→ENAME,PNUMBER→{PNAME,PLOCATION},{SSN,PNUMBER}→HOURS}。确定R,R1和R2的给定分解是无损分解还是有损分解?
解决方案:使用上述算法,让我们解决以上问题。
1.让我们构造一个以上关系R,R1和R2的表,并使用ALGO STEP1以bij或aj的形式插入值(为D中Ri中的每个关系创建一行i的初始矩阵S,一行j对于R中的每个属性aj)。
SSNENAME | PNUMBERPNAME | PLOCATION | HOURS | |||
R1 | b11 | b12 | b13 | b14 | b15 | b16 |
R2 | b21 | b22 | b23 | b24 | b25 | b26 |
使用R = {SSN,ENAME,PNUMBER,PNAME,PLOCATION,HOURS}创建了一个表,其中R的每个属性都在每一列中表示。并且每个分解表R1,R2和R3的初始值均采用bij格式,其中i是行,j是使用ALGO STEP2(为所有矩阵条目设置S(i,j):= bij。 bij是与索引(i,j)*)关联的独特符号
SSNENAME | PNUMBERPNAME | PLOCATION | HOURS | |||
R1 | b11 | b12 | b13 | b14 | b15 | b16 |
R2 | b21 | b22 | b23 | b24 | b25 | b26 |
现在,使用R1 = {ENAME,PLOCATION}和R2 = {SSN,PNUMBER,HOURS,PNAME,PLOCATION}在R1和R2行中将值插入为“ aj”
SSNENAME | PNUMBERPNAME | PLOCATION | HOURS | |||
R1 | a1 | b12 | b13 | b14 | a5 | b16 |
R2 | a1 | b22 | a3 | a4 | a5 | a6 |
给定的功能依赖性为FD = {SSN→ENAME,PNUMBER→{PNAME,位置},{SSN,PNUMBER}→小时}
使用上述算法的步骤4,如果存在函数依赖关系X→Y,则对于两个元组t1,如果存在t2,则对于t2
t1 [X] = t2 [X]那么我们必须
t1 [Y] = t2 [Y]
SSNENAME | PNUMBERPNAME | PLOCATION | HOURS | |||
R1 | a1 | b12 | b13 | b14 | a5 | b16 |
R2 | a1 | b22 | a3 | a4 | a5 | a6 |
在上表中找到X等于Y的X→Y,然后使Y也相等。由于使用上述FD,我们没有找到R1或R2都具有a的任何行,因此我们可以说R之上在R1和R2中分解的结果是有损分解,即在分解过程中不保留信息。
问题2 。给定一个关系模式R = {SSN,ENAME,PNUMBER,PNAME,PLOCATION,HOURS}和分解表
R1 = {SSN,ENAME}
R2 = {PNUMBER,PNAME,位置}
R3 = {SSN,PNUMBER,HOURS}
FD = {SSN→ENAME,PNUMBER→{PNAME,PLOCATION},{SSN,PNUMBER}→HOURS}。
确定R,R1,R @和R3的给定分解是无损分解还是有损分解?
解决方案:使用上述算法,让我们解决以上问题。
让我们构造一个上面的关系R,R1,R2和R3的表,并使用ALGO STEP1以bij或aj的形式插入值(为D中Ri中的每个关系创建一行i的初始矩阵S,为每个Ri的列j创建一个初始矩阵S R中的aj属性)。
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | ||||||
R2 | ||||||
R3 |
使用R = {SSN,ENAME,PNUMBER,PNAME,PLOCATION,HOURS}创建了一个表,其中R的每个属性都在每一列中表示。每个分解表R1,R2和R3的初始值都以bij的格式表示,其中i是行,j是使用ALGO STEP2设置的列(对所有矩阵项都设置S(i,j) := bij。(*每个bij是与索引(i,j)*)关联的独特符号
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | b11 | b12 | b13 | b14 | b15 | b16 |
R2 | b21 | b22 | b23 | b24 | b25 | b26 |
R3 | b31 | b32 | b33 | b34 | b35 | b36 |
现在,使用ALGO STEP3,使用R1 = {SSN,ENAME} R2 = {PNUMBER,PNAME,PLOCATION}和R3 = {SSN,PNUMBER,HOURS}在R1 R2和R3行中将值插入为“ aj”对于每个代表关系模式的行i Ri {对于代表属性Aj的每一列j {if(关系Ri包括属性Aj),则设置S(i,j):= aj;};}; (*每个aj是与索引(j)相关联的不同符号*)
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | a1 | a2 | b13 | b14 | b15 | b16 |
R2 | b11 | b22 | a3 | a4 | a5 | b26 |
R3 | a1 | b32 | a3 | b34 | b35 | a6 |
给定的功能依赖性为FD = {SSN→ENAME,PNUMBER→{PNAME,PLOCATION},{SSN,PNUMBER}→HOURS}
使用上述算法的第4步,如果存在函数依赖关系X→Y,则对于两个元组t1,如果存在,则为t2
t1 [X] = t2 [X]那么我们必须
t1 [Y] = t2 [Y]
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | a1 | a2 | b13 | b14 | b15 | b16 |
R2 | b11 | b22 | a3 | a4 | a5 | b26 |
R3 | a1 | b32 | a3 | b34 | b35 | a6 |
在上表中找到X相等的FD X→Y,然后使Y也相等。
步骤A:通过使用上面的FD SSN→ENAME,我们发现R1和R3的SSN相等,因此R1和R3的ENAME也将相等。该表将如下所示:
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | a1 | a2 | b13 | b14 | b15 | b16 |
R2 | b11 | b22 | a3 | a4 | a5 | b26 |
R3 | a1 | a2 | a3 | b34 | b35 | a6 |
步骤B:通过使用上表中的FD PNUMBER→{PNAME,PLOCATION},我们发现R2和R3的PNUMBER相等,因此R2和R3的PNAME,PLOCATION也将相等。该表将如下所示:
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | a1 | a2 | b13 | b14 | b15 | b16 |
R2 | b11 | b22 | a3 | a4 | a5 | b26 |
R3 | a1 | a2 | a3 | a4 | a5 | a6 |
步骤C:由于使用上面的FD:{SSN,PNUMBER}→HOURS,我们没有找到R1 R2或R3的SSN,PNUMBER相等的任何行,因此上表中没有变化。最后,我们的表如下所示:
SSN | ENAME | PNUMBER | PNAME | PLOCATION | HOURS | |
R1 | a1 | a2 | b13 | b14 | b15 | b16 |
R2 | b11 | b22 | a3 | a4 | a5 | b26 |
R3 | a1 | a2 | a3 | a4 | a5 | a6 |
如果我们看到R3行,我们发现该行中的所有值都具有aj值,从上面的算法可以看出,我们对R1,R2和R3中R的分解是无损的。