关于 Boyce Codd 范式的问题17 Mar 2025 | 6 分钟阅读 要解决 BCNF 相关问题,我们必须理解 BCNF 的定义 定义: 首先,它必须是 3NF。如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 a) X 是超键 3NF 和 BCNF 之间的关系是 所有 BCNF 都是 3NF,但反之不一定成立。 问题: 给定关系 R(X, Y, Z) 和函数依赖集 FD = { XY → Z 和 Z → Y },判断给定的 R 是否为 BCNF?如果不是,将其转换为 BCNF。 解决方案: 让我们使用 FD 在 R 上构建一个箭头图来计算候选键。 ![]() 从 R 上的上述箭头图中,我们可以看到属性 X 不由任何给定的 FD 确定,因此 X 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,所有候选键都将强制包含属性 X。 让我们计算 X 的闭包 X + = X(根据我们之前学过的闭包方法) 由于 X 的闭包只包含 X,因此它不是候选键。 让我们检查 Y 的组合,即 XY,XZ。 a) XY + = XYZ(根据我们之前学过的闭包方法) 由于 XY 的闭包包含 R 的所有属性,因此 XY 是候选键 b) XZ + = XZY(根据我们之前学过的闭包方法) 由于 XZ 的闭包包含 R 的所有属性,因此 XZ 是候选键 因此,有两个候选键 XY 和 XZ 由于 R 有 3 个属性:X、Y、Z,候选键是 XY 和 XZ,因此,主属性(候选键的一部分)是 X、Y 和 Z,而非主属性则没有。 使用 3NF 的定义来检查 R 是否为 3NF?: 首先,它应该是 2NF。如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 a) X 是超键 b) 或者 Y 是主属性。 给定的 FD 是 XY → Z 和 Z → Y,超键/候选键是 XZ 和 XY a) FD: XY → Z 满足 3NF 的定义,因为 XY 是超键,Z 也是主属性。 b) FD: Z → Y 满足 3NF 的定义,尽管 Z 不是超键,但 Y 是主属性。 由于 R 的两个 FD:XY → Z 和 Z → Y 都满足 3NF 的定义,因此 R 是 3NF。 使用 BCNF 的定义来检查 R 是否为 BCNF?: 首先,它应该是 3NF。如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 a) X 是超键 给定的 FD 是 XY → Z 和 Z → Y,超键/候选键是 XZ 和 XY b) FD: XY → Z 满足 BCNF 的定义,因为 XY 是超键。 c) FD: Z → Y 不满足 BCNF 的定义,因为 Z 不是超键。由于 R 的两个 FD:XY → Z 和 Z → Y 都满足 3NF 的定义,因此 R 是 3NF。 将表 R(X, Y, Z) 转换为 BCNF 由于 FD: Z → Y 导致我们的表不是 BCNF,让我们分解该表 FD: Z→ Y 造成了问题,因此创建一个表 R1(Z, Y) 为键 XY 创建表 R2(X, Y),因为 XY 是候选键 为键 XZ 创建表 R2(X, Z),因为 XZ 是候选键 注意:当我们有多个键(例如:XY 和 XZ)时,在分解时请记住将 R2 和 R3 与 R1 进行比较,以便在 R1 和 R2 或 R1 和 R3 之间至少有一个共同属性,并且该共同属性必须是任何一个表中的键。考虑 R1(Z, Y) 和 R2(X, Y),两个表有一个共同属性 Y,但 Y 不是 R1 和 R2 中任何一个表的键,因此我们舍弃 R2(X, Y),即舍弃候选键 XY。 考虑 R1(Z, Y) 和 R3(X, Z),两个表有一个共同属性 Z,并且 Z 是 R1 表的键,因此我们包含 R3(X, Z),即包含候选键 XZ。 因此,分解后的表是 BCNF R1(Z, Y) R2(X, Z) 问题 2: 给定关系 R(X, Y, Z) 和函数依赖集 FD = { X → Y 和 Y → Z },判断给定的 R 是否为 BCNF?如果不是,将其转换为 BCNF。 解:让我们使用FD在R上构建一个箭头图来计算候选键。 ![]() 从 R 上的上述箭头图中,我们可以看到属性 X 不由任何给定的 FD 确定,因此 X 将是候选键的组成部分,即无论候选键是什么,有多少个候选键,所有候选键都将强制包含属性 X。 让我们计算 X 的闭包 X + = XYZ(根据我们之前学过的闭包方法) 由于 X 的闭包包含 R 的所有属性,因此 X 是候选键 根据候选键的定义(候选键是超键,其任何真子集都不是超键) 使用 BCNF 的定义来检查 R 是否为 BCNF?: 首先,它应该是 3NF。如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 a) X 是超键 首先,我们检查表是否为 3NF? 使用 3NF 的定义来检查 R 是否为 3NF?: 如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 a) X 是超键 b) 或者 Y 是主属性。 a) FD: X → Y 是 3NF (因为 X 是超键) b) 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) R1(X, Y) 和 R2(Y, Z) 都是 BCNF 结论: 从以上三个例子我们可以得出结论,遵循以下步骤来检查给定的关系模式 R 是否为 3NF?如果不是,如何将其分解为 3NF。 步骤 1: 通过使用箭头图,然后使用属性在 R 上的闭包,计算给定 R 的候选键,以便从计算出的候选键中,我们可以分离出主属性和非主属性。 步骤 2: 验证每个 FD 是否符合 BCNF 的定义(首先它必须是 3NF。如果两个属性集 X 和 Y 之间存在非平凡依赖关系,即 X → Y (Y 不是 X 的子集),那么 X 是超键)。 步骤 3: 形成一个不满足 BCNF 的 FD 集合,即所有那些 FD 的左侧属性不是超键。 步骤 4: 通过分解 R 将表 R 转换为 BCNF,使得每个基于 FD 的分解都满足 BCNF 的定义。 步骤 5: 完成基于 FD 的分解后,为候选键中的属性创建一个单独的表。 步骤 6: 从步骤 4 和步骤 5 获得的所有分解后的 R 构成所需的分解,其中每个分解都是 BCNF。 下一个主题规范化问题 |
我们请求您订阅我们的新闻通讯以获取最新更新。