关于第三范式的问题

2025年03月17日 | 阅读 9 分钟

要解决 3NF 的问题,我们必须理解它的两个定义。

定义 1: 如果一个关系模式 R 首先在 2NF,并且没有非主属性传递依赖于表的键,则称 R 为 3NF。

如果存在 X → Y 和 Y → Z,则 X → Z 也存在,这是一个传递依赖,不应该成立。

定义 2: 首先,它应该在 2NF,并且如果两个属性集 X 和 Y 之间存在非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么

  1. X 是超键
  2. 或者 Y 是主属性。

问题 1: 给定一个关系 R( X, Y, Z) 和函数依赖集 FD = { X → Y and Y → Z },判断给定的 R 是否为 3NF?如果不是,则将其转换为 3 NF。

解:让我们使用FD在R上构建一个箭头图来计算候选键。

QUESTIONS ON THIRD NORMAL FORM

从上面 R 的箭头图可以看出,属性 X 不被任何给定的 FD 确定,因此 X 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,它们都必然包含 X 属性。

我们计算 X 的闭包

X + = XYZ(根据我们之前学过的闭包方法)

由于 X 的闭包包含 R 的所有属性,因此 X 是候选键

根据候选键的定义(候选键是超键,其任何真子集都不是超键

由于所有键都将 X 作为组成部分,并且我们已经证明 X 是候选键,因此 X 的任何超集都将是超键,但不是候选键。

因此,只有 一个候选键 X

3NF 定义: 如果一个关系模式 R 首先在 2NF,并且没有非主属性传递依赖于表的键,则称 R 为 3NF。

如果存在 X → Y 和 Y → Z,则 X → Z 也存在,这是一个传递依赖,不应该成立。

由于 R 有 3 个属性:X、Y、Z,候选键是 X。因此,主属性(候选键的一部分)是 X,而非主属性是 Y 和 Z。

给定的 FD 是 X → Y 和 Y → Z。

所以,我们可以写成 X → Z(这是一个传递依赖)。

在上面的 FD X → Z 中,非主属性 (Z) 传递依赖于表的键 (X),因此根据 3NF 的定义,它不是 3 NF,因为非主属性不应该传递依赖于表的键。

现在检查上面的表是否在 2 NF。

  1. FD: X → Y 在 2NF 中(因为键没有被破坏,并且它完全函数依赖)。
  2. FD: Y → Z 也在 2NF 中(因为它不违反 2NF 的定义)。

因此,上面的表 R( X, Y, Z ) 是 2NF,但不是 3NF。

我们也可以从定义 2 来证明:首先,它应该在 2NF,并且如果存在非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么

  1. X 是超键
  2. 或者 Y 是主属性。

由于我们刚刚证明了上面的表 R 是 2 NF。让我们使用定义 2 来检查它是否是 3NF。

  1. FD: X → Y 在 3NF 中(因为 X 是超键)。
  2. FD: Y → Z 不在 3NF 中(因为 Y 不是键,Z 也不是主属性)。

因此,由于 Y → Z,根据 3NF 的定义 2,我们可以说上面的表 R 不是 3NF。

将表 R( X, Y, Z) 转换为 3NF。

由于 FD: Y → Z,我们的表不是 3NF,让我们分解表。

FD: Y → Z 出现了问题,因此一个表 R1(Y, Z)。

为键 X 创建一个表,R2(X, Y),因为 X → Y。

因此,分解后的表是 3NF:

R1(X, Y)

R2(Y, Z)

问题 2:给定一个关系 R( X, Y, Z, W, P) 和函数依赖集 FD = { X → Y, Y → P, and Z → W },判断给定的 R 是否为 3NF?如果不是,则将其转换为 3 NF。

解:让我们使用FD在R上构建一个箭头图来计算候选键。

QUESTIONS ON THIRD NORMAL FORM

从上面 R 的箭头图可以看出,属性 XZ 不被任何给定的 FD 确定,因此 XZ 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,它们都必然包含 XZ 属性。

我们计算 XZ 的闭包。

XZ + = XZYPW(根据我们之前学过的闭包方法)。

由于 XZ 的闭包包含 R 的所有属性,因此 XZ 是候选键

根据候选键的定义(候选键是超键,它的任何真子集都不是超键)。

由于所有键都将 XZ 作为组成部分,并且我们已经证明 XZ 是候选键,因此 XZ 的任何超集都将是超键,但不是候选键。

因此,只有 一个候选键 XZ

3NF 定义: 首先,它应该在 2NF,并且如果存在两个属性集 X 和 Y 之间的非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么

  1. X 是超键
  2. 或者 Y 是主属性。

由于 R 有 5 个属性:X、Y、Z、W、P,候选键是 XZ。因此,主属性(候选键的一部分)是 X 和 Z,而非主属性是 Y、W 和 P。

给定的 FD 是 X → Y、Y → P 和 Z → W,超键/候选键是 XZ。

  1. FD: X → Y 不满足 3NF 的定义,因为 X 不是超键,Y 也不是主属性。
  2. FD: Y → P 不满足 3NF 的定义,因为 Y 不是超键,P 也不是主属性。
  3. FD: Z → W 满足 3NF 的定义,因为 Z 不是超键,W 也不是主属性。

将表 R( X, Y, Z, W, P) 转换为 3NF。

由于所有 FD = { X → Y, Y → P, and Z → W } 都不在 3NF 中,让我们将 R 转换为 3NF。

R1(X, Y) {使用 FD X → Y}

R2(Y, P) {使用 FD Y → P}

R3(Z, W) {使用 FD Z → W}

并创建一个用于候选键 XZ 的表。

R4( X, Z) { 使用候选键 XZ }

所有分解后的表 R1、R2、R3 和 R4 都在 2NF(因为没有部分依赖)并且也在 3NF 中。

因此,分解后的表是:

R1(X, Y), R2(Y, P), R3( Z, W),R4( X, Z)

问题 3:给定一个关系 R( P, Q, R, S, T, U, V, W, X, Y) 和函数依赖集 FD = { PQ → R, P → ST, Q → U, U → VW, and S → XY },判断给定的 R 是否为 3NF?如果不是,则将其转换为 3 NF。

解:让我们使用FD在R上构建一个箭头图来计算候选键。

QUESTIONS ON THIRD NORMAL FORM

从上面 R 的箭头图可以看出,属性 PQ 不被任何给定的 FD 确定,因此 PQ 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,它们都必然包含 PQ 属性。

我们计算 PQ 的闭包。

PQ + = P Q R S T U X Y V W(根据我们之前学过的闭包方法)。

由于 XZ 的闭包包含 R 的所有属性,因此 PQ 是候选键

根据候选键的定义(候选键是超键,其任何真子集都不是超键

由于所有键都将 PQ 作为组成部分,并且我们已经证明 XZ 是候选键,因此 PQ 的任何超集都将是超键,但不是候选键。

因此,只有 一个候选键 PQ

3NF 定义: 首先,它应该在 2NF,并且如果存在两个属性集 X 和 Y 之间的非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么

c) X 是超键

d) 或者 Y 是主属性。

由于 R 有 10 个属性:P、Q、R、S、T、U、V、W、X、Y、V、W,候选键是 PQ。因此,主属性(候选键的一部分)是 P 和 Q,而非主属性是 R S T U V W X Y V W。

给定的 FD 是 {PQ → R, P → ST, Q → U, U → VW and S → XY},超键/候选键是 PQ。

  1. FD: PQ → R 满足 3NF 的定义,因为 PQ 是超键。
  2. FD: P → ST 不满足 3NF 的定义,因为 P 不是超键,ST 也不是主属性。
  3. FD: Q → U 不满足 3NF 的定义,因为 Q 不是超键,U 也不是主属性。
  4. FD: U → VW 不满足 3NF 的定义,因为 U 不是超键,VW 也不是主属性。
  5. FD: S → XY 不满足 3NF 的定义,因为 S 不是超键,XY 也不是主属性。

将表 R( X, Y, Z, W, P) 转换为 3NF。

由于所有 FD = { P → ST, Q → U, U → VW, and S → XY } 都不在 3NF 中,让我们将 R 转换为 3NF。

R1(P, S, T) {使用 FD P → ST }

R2(Q, U) {使用 FD Q → U }

R3( U, V, W) { 使用 FD U → VW }

R4( S, X, Y) { 使用 FD S → XY }

R5( P, Q, R) { 使用 FD PQ → R,以及候选键 PQ }

所有分解后的表 R1、R2、R3、R4 和 R5 都在 2NF(因为没有部分依赖)并且也在 3NF 中。

因此,分解后的表是:

R1(P, S, T), R2(Q, U), R3(U, V, W), R4( S, X, Y),R5( P, Q, R)

结论:从以上三个例子,我们可以得出以下步骤来检查给定的关系模式 R 是否为 3 NF?如果不是,如何将其分解为 3 NF。

步骤 1: 使用箭头图计算给定 R 的候选键,然后使用 R 上属性的闭包,以便从计算出的候选键中,我们可以区分主属性和非主属性。

步骤 2: 使用3NF 定义验证每个 FD(首先,它应该在 2NF,并且如果存在两个属性集 X 和 Y 之间的非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么 X 是超键或 Y 是主属性)。

步骤 3: 制作一个不满足 3NF 的 FD 集合,即所有那些 FD,其 FD 左侧的属性不是超键,或者右侧的属性不是主属性。

步骤 4: 通过分解 R 将表 R 转换为 3NF,使得每次基于 FD 的分解都满足 3NF 的定义。

步骤 5: 完成基于 FD 的分解后,为候选键中的属性创建一个单独的表。

步骤 6: 从步骤 4 和步骤 5 获得的所有分解的 R 构成了所需的分解,其中每个分解都属于 3NF。