BCNF分解和数据库的无损连接

时间:2015-11-27 19:38:14

标签: database database-design functional-dependencies bcnf

嘿,我所有的作业都说:

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

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

1 个答案:

答案 0 :(得分:7)

你的问题

  

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

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

A部分

要将关系R和一组功能依赖关系(FD's)转换为3NF,您可以使用 伯恩斯坦的综合 即可。申请伯恩斯坦的综合 -

  • 首先我们确保给定的一组FD's最小化
  • 第二次我们会将每个FD设为自己的子架构。
  • 第三次我们尝试合并这些子架构
在您的情况下

例如

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

首先我们检查FD's是否为最小封面(单身右手边,没有无关的左侧属性,没有冗余的FD

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

因此,给定的一组FD已经是最小限度。

第二我们使每个FD成为自己的子架构。所以现在我们有 - (每个关系的键都是粗体

[R <子> 1 = {的 A,d ,C}
[R <子> 2 = {的 B,C 下,A}
[R <子> 3 = {<强> C
下,d}
[R <子> 4 = {的 A 下,B}

第三我们看到是否可以组合任何子模式。我们看到 R 1 R 2 已经具有R的所有属性,因此R 3 和R 4 可以省略。所以现在我们有 -

S 1 = {A,D,C}
S 2 = {B,C,A}

这是 3NF 。现在检查 BCNF ,我们检查这些关系中的任何一个(S 1 ,S 2 )是否违反 BCNF的条件每个功能依赖X->Y左侧(X必须 超级键< / strong> )。在这种情况下,这些都不会违反 BCNF ,因此它也会被分解为 BCNF

B部分

当您按上述方法应用Bernstein Synthesis来分解R时,分解总是依赖于保留。现在的问题是,分解是否无损?要检查我们是否可以遵循以下方法:

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

enter image description here

我们将 放在我们在各自分解关系中的所有属性中,如图1所示。现在我们通过所有FD&#39; {C - > D,A-> B,AD-> C,BC-> A}逐个并且尽可能地添加 a 。例如,第一FD是C-> D.由于C列中的两行都有 a ,并且D列的第二行中有一个空插槽,我们将 a < / strong>在图像的右侧部分显示。我们会在其中一行完全填充 a 时停止,这表示它是无损分解。如果我们浏览了所有的FD并且我们的表中的所有行都没有完全填充 a ,那么这是一个有损分解。

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

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