分解依赖项时的正确方法是什么

时间:2017-08-06 15:58:26

标签: functional-dependencies 3nf bcnf canonical-form

您好我正在学习将在11天后进行的考试。我正在努力解决Carnonical Cover,Dependency Preservation和Lossless Decomposition。我对正常形式和上述提到的主题也有点模糊,每当我做运动时,我似乎都搞砸了。我的问题是这里的方法和想法是否正确:

R(ABCDEFG) 在提供规范封面后,提供以下一组依赖关系。我自己没有做规范封面,但作业说我必须假设它已经完成了。

Fc:
  A -> C
  E -> A
  C -> ABF
  F -> CDG

A+ = ABCDFG
E+ = ABCDEFG
C+ = ABCDFG
F+ = ABCDFG

E = Candidate Key. 

此功能依赖项列表在2NF中,因为没有部分依赖项。然而,由于存在转换依赖性,因此它不在3NF中。

然而,分解为以下4个关系将导致它不仅在3NF而且还在BCNF

R1 = {E,A}
  E -> A

R2 = {A, C}
  A -> C

R3 = {CABF} 
  C -> ABF

R4 = {FCDG}
  F -> CDG

我使用R1中的A作为R2的外键,R2中的C作为R3等的外键。

现在没有可转换的依赖关系,因为它们各自关系中的所有左侧都是候选键,所以它在BCNF中。

它是否也没有无损和依赖保留?

1 个答案:

答案 0 :(得分:1)

什么是分解

在标题中你说:

  

分解依赖项时的正确方法是什么

但是一个不分解依赖关系,而是分解关系模式。因此,在这种情况下,这里有一个关系模式grep -Ff patterns file ,它具有一组功能依赖关系,并且必须分解该模式。

什么是分解

分解产生一组具有以下属性的关系模式:a)原始模式的每个属性都存在于某些(可能不止一个)子模式中; b)不存在其他属性。此外,当关系子模式包含在另一个中时,分解是多余的。在您的情况下,R(ABCDEFG)包含在R2中,这是正确的:不需要同时存在这两种关系,因为它意味着无用的数据冗余。

什么是良好的分解

要真正有用,分解应满足两个重要属性:保留功能依赖性并保留数据(无损分解)。但是另一个属性表征了一个好的分解:它应该尽可能小:在太多子模式中分解模式没有意义,因为这会产生一个非自然和复杂的数据库。

实际上,您的分解是无损的,并保留了依赖关系。

如何分解

所有这些东西的最终目标是产生一个分解(无损和依赖保留),其中子模式是BCNF或3NF。通过使用函数依赖项的属性进行分解的简单解决方案是 not ,但是,这是一个很好的解决方案。为此,在教科书中描述的算法产生BCNF或3NF的分解(BCNF的所谓“分析”算法和3NF的“合成”算法),试图产生不太多的子模式。例如,在这种情况下,“分析”算法在BCNF中产生以下分解,只有两个子模式:

R3

这种分解是无损的,并保留了依赖关系(分析算法并不总是如此)。