📜  丢失或丢失的分解(第二种方法)

📅  最后修改于: 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的分解是无损的