有损或无损分解(第二种方法)

2024 年 8 月 28 日 | 阅读 6 分钟

算法: 测试无损(非加性)连接属性。

输入: 一个通用关系 R,一个 R 的分解 D = { R1, R2, R3, ….. Rm },以及一组函数依赖 F

1. 创建一个初始矩阵 S,其中一行 i 对应 D 中 Ri 的每个关系,一列 j 对应 R 中的每个属性 Aj。

2. 将 S(i, j) 设置为 := bij,用于所有矩阵条目。(* 每个 bij 是与索引 (i, j) 相关联的不同符号 *)

3. 对于表示关系模式 Ri 的每一行 i

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 的表,并使用算法步骤 1(创建初始矩阵 S,其中一行 i 对应 D 中 Ri 的每个关系,一列 j 对应 R 中的每个属性 aj)插入 bij 或 aj 形式的值。

SSN ENAMEPNUMBER PNAMEPLOCATIONHOURS
R1b11b12b13b14b15b16
R2b21b22b23b24b25b26

使用 R = { SSN, ENAME, PNUMBER, PNAME, PLOCATION, HOURS } 创建了一个表,其中 R 的每个属性都在每列中表示。并使用算法步骤 2(将 S(i, j) 设置为 := bij,用于所有矩阵条目。(* 每个 bij 是与索引 (i, j) 相关联的不同符号 *))将每个分解表 R1、R2 和 R3 的初始值设置为 bij 格式,其中 i 是行,j 是列。

SSN ENAMEPNUMBER PNAMEPLOCATIONHOURS
R1b11b12b13b14b15b16
R2b21b22b23b24b25b26

现在使用 R1 = { ENAME, PLOCATION } 和 R2 = { SSN, PNUMBER, HOURS, PNAME, PLOCATION } 将值插入 R1 和 R2 行作为 "aj"

SSN ENAMEPNUMBER PNAMEPLOCATIONHOURS
R1a1b12b13b14a5b16
R2a1b22a3a4a5a6

给定的函数依赖是 FD = {SSN → ENAME, PNUMBER → {PNAME, PLOCATION}, {SSN, PNUMBER } → HOURS }

使用上述算法的步骤 4,如果存在函数依赖 X → Y,并且对于两个元组 t1 和 t2,如果

t1 [ X ] = t2 [ X ],那么我们必须有

t1 [ Y ] = t2 [ Y ]

SSN ENAMEPNUMBER PNAMEPLOCATIONHOURS
R1a1b12b13b14a5b16
R2a1b22a3a4a5a6

在上表中查找是否存在 X → Y,其 X 相等,然后使 Y 也相等。由于使用上述 FD,我们没有发现 R1 或 R2 的任何一行都包含所有的 a,因此我们可以说 R 在 R1 和 R2 中的分解是有损分解,即在分解过程中信息没有保留。

问题 2。给定关系模式 R = { SSN, ENAME, PNUMBER, PNAME, PLOCATION, HOURS } 和分解表

R1 = { SSN, ENAME }

R2 = { PNUMBER, PNAME, PLOCATION }

R3 = { SSN, PNUMBER, HOURS }

FD = { SSN → ENAME, PNUMBER → { PNAME, PLOCATION}, { SSN, PNUMBER } → HOURS }。

识别给定 R、R1 R@ 和 R3 的分解是有损分解还是无损分解?

解决方案: 使用上述算法解决上述问题。

让我们构建上述关系 R、R1 R2 和 R3 的表,并使用算法步骤 1(创建初始矩阵 S,其中一行 i 对应 D 中 Ri 的每个关系,一列 j 对应 R 中的每个属性 aj)插入 bij 或 aj 形式的值。

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1
R2
R3

使用 R = { SSN, ENAME, PNUMBER, PNAME, PLOCATION, HOURS } 创建了一个表,其中 R 的每个属性都在每列中表示。并使用算法步骤 2(将 S(i, j) 设置为 := bij,用于所有矩阵条目。(* 每个 bij 是与索引 (i, j) 相关联的不同符号 *))将每个分解表 R1、R2 和 R3 的初始值设置为 bij 格式,其中 i 是行,j 是列。

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1b11b12b13b14b15b16
R2b21b22b23b24b25b26
R3b31b32b33b34b35b36

现在使用 R1 = { SSN, ENAME }、R2 = { PNUMBER, PNAME, PLOCATION } 和 R3 = { SSN, PNUMBER, HOURS },根据算法步骤 3 的规定,对于表示关系模式 Ri 的每一行 i {对于表示属性 Aj 的每一列 j {如果(关系 Ri 包含属性 Aj),则设置 S(i, j):=aj;};}; (* 每个 aj 是与索引 (j) 相关联的不同符号 *),将值插入行 R1、R2 和 R3 为 "aj"。

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1a1a2b13b14b15b16
R2b11b22a3a4a5b26
R3a1b32a3b34b35a6

给定的函数依赖是 FD = { SSN → ENAME, PNUMBER → { PNAME, PLOCATION}, { SSN, PNUMBER } → HOURS }

使用上述算法的步骤 4,如果存在函数依赖 X → Y,并且对于两个元组 t1 和 t2,如果

t1 [ X ] = t2 [ X ],那么我们必须有

t1 [ Y ] = t2 [ Y ]

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1a1a2b13b14b15b16
R2b11b22a3a4a5b26
R3a1b32a3b34b35a6

在上表中查找是否存在 FD X → Y,其 X 相等,然后使 Y 也相等。

步骤 A: 通过使用上述 FD SSN → ENAME,我们发现 R1 和 R3 的 SSN 相等,因此 R1 和 R3 的 ENAME 也将相等。该表将如下所示

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1a1a2b13b14b15b16
R2b11b22a3a4a5b26
R3a1a2a3b34b35a6

步骤 B: 通过在上述表上使用 FD PNUMBER → {PNAME, PLOCATION},我们发现 R2 和 R3 的 PNUMBER 相等,因此 R2 和 R3 的 PNAME、PLOCATION 也将相等。该表将如下所示

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1a1a2b13b14b15b16
R2b11b22a3a4a5b26
R3a1a2a3a4a5a6

步骤 C: 由于通过使用上述 FD: {SSN, PNUMBER} → HOURS,我们没有发现 R1、R2 或 R3 的任何一行其 SSN、PNUMBER 相等,因此上述表将没有变化。最终,我们的表如下所示

SSNENAMEPNUMBERPNAMEPLOCATIONHOURS
R1a1a2b13b14b15b16
R2b11b22a3a4a5b26
R3a1a2a3a4a5a6

如果我们查看第 R3 行,我们发现该行中的所有值都具有 aj 值,根据上述算法,我们可以说 R 在 R1、R2 和 R3 中的分解是无损的