【问题标题】:BCNF Decompositions and Lossless joins for Databases数据库的 BCNF 分解和无损连接
【发布时间】:2023-03-19 04:43:01
【问题描述】:

大家好,我有一个作业说:

令 R(ABCD) 为函数依赖关系 A → B, C → D, AD → C, BC → A 以下哪项是 R 到 Boyce-Codd 范式 (BCNF) 的无损连接分解?

我一直在 youtube 上研究和观看视频,但似乎找不到如何开始。我想我应该把它分解成子模式,然后填写一张表格来找出哪个是无损的,但我在开始时遇到了麻烦。任何帮助将不胜感激!

【问题讨论】:

  • 如果你用谷歌搜索 BCNF 分解,网上有很多大学幻灯片。网上也有很多数据库教科书。你的问题本质上是在问一本书的那个部分。

标签: database database-design functional-dependencies bcnf


【解决方案1】:

你的问题

以下哪项是 R 的无损连接分解为 Boyce-Codd 范式 (BCNF)?

建议你有一组选项,你必须选择其中一个是无损分解,但由于你没有提到我首先(A部分)将关系分解为BCNF(先到 3NF,然后是 BCNF)然后(PART B)说明了如何检查这个给定的分解是否是无损连接分解。如果您只是想知道如何检查给定的 BCNF 分解是否无损或不直接跳转到我的答案的 B 部分。

A部分

要将关系 R 和一组函数依赖 (FD's) 转换为 3NF,您可以使用 伯恩斯坦综合。应用伯恩斯坦综合 -

  • 首先我们确保给定的FD's 集合是最小覆盖
  • 第二我们采用每个FD 并使其成为自己的子架构。
  • 第三我们尝试结合这些子模式

例如在你的情况下:

R = {A,B,C,D}
FD = {A->B,C->D,AD->C,BC->A}

首先我们检查FD's 是否是最小覆盖(右侧单例,没有多余的左侧属性,没有多余的 FD

  • Singleton RHS:所有给定的 FD 已经有单例 RHS。
  • 没有多余的 LHS 属性: 没有一个 FD 具有需要删除的多余的 LHS 属性。
  • 没有多余的 FD: 没有多余的 FD。

因此,给定的 FD 集已经是最小覆盖。

第二我们让每个FD 都有自己的子模式。所以现在我们有了 -(每个关系的键都是粗体

R1={A,D,C}
R2={B,C,A}
R3={C,D}
R4={A,B}

第三我们看看是否可以组合任何子模式。我们看到 R1R2 已经拥有R 的所有属性,因此 R3 和 R4 可以省略。所以现在我们有 -

S1 = {A,D,C}
S2 = {B,C,A}

这在 3NF 中。现在检查BCNF,我们检查这些关系(S1,S2)是否违反BCNF的条件strong>(即对于每个函数依赖X->Y左侧(X必须是一个超级键) 。在这种情况下,这些都没有违反 BCNF,因此它也被分解为 BCNF

第二部分

当您应用上面的 Bernstein 合成分解 R 时,分解总是保持依赖关系。现在的问题是,分解是无损的吗?要检查我们是否可以遵循以下方法:

创建一个如图 1 所示的表,其行数等于分解的关系数,列数等于我们原始给定 R 中的属性数。

我们将 a 放在我们在各自分解关系中存在的所有属性中,如图 1 所示。现在我们遍历所有 FD 的 {C->D, A->B,AD->C,BC->A} 一一添加,并尽可能添加a。例如,第一个 FD 是 C->D。由于 C 列中的两行都有 a 并且 D 列的第二行有一个空槽,我们放置了一个 a 如右图所示。一旦其中一行完全被 a 填充,我们就会停止,这表明它是无损分解。如果我们遍历所有的 FD,并且我们的表中没有一行完全被 a 填满,那么这是一个有损分解。

另外,请注意,如果它是有损分解,我们总是可以通过向由主键的所有属性组成的分解关系集再添加一个关系来使其无损。

我建议您观看this 视频,了解更多有关此方法的示例。还other way 检查涉及关系代数的无损连接分解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2011-05-17
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多