1

您好,我目前正在准备考试,考试将在 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 中。

它不是也无损和保持依赖关系吗?

4

1 回答 1

2

分解什么

在标题中你说:

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

但是一个不分解依赖关系,而是关系模式。因此,在这种情况下,这里有一个R(ABCDEFG)具有一组功能依赖关系的关系模式,并且必须分解该模式。

什么是分解

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

什么是好的分解

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

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

如何分解

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

R1 < (A B C D F G) ,
    { F → C
      F → D
      F → G
      C → A
      C → B
      C → F
      A → C } >

R2 < (A E) ,
    { E → A } >

这种分解是无损的并且保留了依赖关系(这对于分析算法并不总是正确的)。

于 2017-08-06T20:22:47.550 回答