当关系模型中的关系不处于适当的范式时,就会进行关系的分解。如果分解是无损连接和依赖保留,则关系 R 被分解为两个或多个关系。
无损连接分解
如果我们将关系 R 分解为关系 R1 和 R2,
- 如果 R1 ⋈ R2 ⊃ R,分解是有损的
- 如果 R1 ⋈ R2 = R,则分解是无损的
要使用 FD 集检查无损连接分解,必须满足以下条件:
- R1 和R2 的属性联合必须等于R 的属性。R 的每个属性必须在R1 或R2 中。
Att(R1) U Att(R2) = Att(R)
- R1 和 R2 的属性交集不能为 NULL。
Att(R1) ∩ Att(R2) ≠ Φ
- 公共属性必须是至少一个关系(R1 或 R2)的键
Att(R1) ∩ Att(R2) -> Att(R1) or Att(R1) ∩ Att(R2) -> Att(R2)
例如,具有 FD 集合{A->BC} 的关系 R (A, B, C, D) 被分解为 R1(ABC) 和 R2(AD),这是一个无损连接分解为:
- 第一个条件成立,因为 Att(R1) U Att(R2) = (ABC) U (AD) = (ABCD) = Att(R)。
- 第二个条件成立,因为 Att(R1) ∩ Att(R2) = (ABC) ∩ (AD) ≠ Φ
- 第三个条件成立,因为 Att(R1) ∩ Att(R2) = A 是 R1(ABC) 的键,因为 A->BC 是给定的。
依赖保留分解
如果我们将关系 R 分解为关系 R1 和 R2,则 R 的所有依赖项要么必须是 R1 或 R2 的一部分,要么必须是从 R1 和 R2 的 FD 组合推导出来的。
例如,具有 FD 集合{A->BC} 的关系 R (A, B, C, D) 被分解为 R1(ABC) 和 R2(AD),这是依赖保持的,因为 FD A->BC 是R1(ABC)。
GATE 问题:考虑模式 R(A,B,C,D) 和函数依赖关系 A->B 和 C->D。然后将 R 分解为 R1(AB) 和 R2(CD) 是 [GATE-CS-2001]
A. 依赖保留和无损连接
B. 无损连接但不保留依赖
C. 依赖保留但不是无损连接
D. 非依赖保留和非无损连接
答:对于无损连接分解,这三个条件必须成立:
- Att(R1) U Att(R2) = ABCD = Att(R)
- Att(R1) ∩ Att(R2) = Φ,违反了无损连接分解的条件。因此分解不是无损的。