关于第三范式的问题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: 给定一个关系 R( X, Y, Z) 和函数依赖集 FD = { X → Y and Y → Z },判断给定的 R 是否为 3NF?如果不是,则将其转换为 3 NF。 解:让我们使用FD在R上构建一个箭头图来计算候选键。 ![]() 从上面 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。
因此,上面的表 R( X, Y, Z ) 是 2NF,但不是 3NF。 我们也可以从定义 2 来证明:首先,它应该在 2NF,并且如果存在非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么
由于我们刚刚证明了上面的表 R 是 2 NF。让我们使用定义 2 来检查它是否是 3NF。
因此,由于 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上构建一个箭头图来计算候选键。 ![]() 从上面 R 的箭头图可以看出,属性 XZ 不被任何给定的 FD 确定,因此 XZ 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,它们都必然包含 XZ 属性。 我们计算 XZ 的闭包。 XZ + = XZYPW(根据我们之前学过的闭包方法)。 由于 XZ 的闭包包含 R 的所有属性,因此 XZ 是候选键。 根据候选键的定义(候选键是超键,它的任何真子集都不是超键)。 由于所有键都将 XZ 作为组成部分,并且我们已经证明 XZ 是候选键,因此 XZ 的任何超集都将是超键,但不是候选键。 因此,只有 一个候选键 XZ。 3NF 定义: 首先,它应该在 2NF,并且如果存在两个属性集 X 和 Y 之间的非平凡依赖,使得 X → Y(即 Y 不是 X 的子集),那么
由于 R 有 5 个属性:X、Y、Z、W、P,候选键是 XZ。因此,主属性(候选键的一部分)是 X 和 Z,而非主属性是 Y、W 和 P。 给定的 FD 是 X → Y、Y → P 和 Z → W,超键/候选键是 XZ。
将表 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上构建一个箭头图来计算候选键。 ![]() 从上面 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。
将表 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。 下一个主题函数依赖的等价性 |
我们请求您订阅我们的新闻通讯以获取最新更新。