依赖关系保留,基于原始功能依赖关系还是规范覆盖?

时间:2019-04-19 22:28:17

标签: database database-normalization relational-algebra functional-dependencies bcnf

鉴于这些功能依赖性

R: {A,B,C,D,E,F}

AC->EF
E->CD
C->ADEF
BDF->ACD

我把它当作规范的封面:

E->C
C->ADEF
BF->C

然后将其分解为Boyce Codd正常形式:

Relation 1: {C,A,D,E,F} 
Relation 2: {B,F,C}

我认为这是无损且保持依赖性的吗?但这是真的,因为从最初的功能依赖关系开始,BDF-> ACD不再存在于我的任何关系中。但是,如果我从计算得出的规范范围来看,那么我所有的功能依赖关系都会保留下来。

这个问题是:是否保留了对BCNF依赖关系的分解?

1 个答案:

答案 0 :(得分:1)

当且仅当依赖项在分解关系上的投影的并集覆盖关系的依赖项时,分解才能保留依赖项。

因此,要知道分解是否保留依赖关系,仅检查特定封面的依赖关系是否已保留是不够的(例如,通过查看某个分解关系是否具有依赖关系的所有属性) 。例如,在具有封面R(ABC)的关系F = {A→B, B→C, C→A}中,人们可能会认为在分解R1(AB)R2(BC)中,依赖项C→A未被保留。但是,如果将F投影到AB上,则会得到A→B, B→A,将它投影到BC上则会得到B→C, C→B,因此从它们的并集中,您还可以得出{{1 }}。

即使存在执行该任务的多项式算法,检查也不是一件容易的事(例如,J。Ullman在《数据库系统原理》(计算机科学出版社,1983年)中对此进行了描述。

假设给定的依赖关系覆盖了关系的依赖关系,则发现的规范覆盖范围不正确。实际上C→A不能从原始依赖关系中得出。

由于这个原因,您的分解是不正确的,因为BF -> C不在BCNF中(实际上,它不在2NF中)。

R2(BCF)的一种可能的规范封面如下:

R

在分析算法之后,BCNF中有两种可能的分解(根据为消除而选择的依赖性)。一个是:

BDF → C
C → A
C → E
C → F
E → C
E → D 

而另一个是:

R1 = (ACDEF)
R2 = (BC)

(请注意,R1 = (ACDEF) R3 = (BE) BCBE一起是原始关系的候选键)。

BDF中的依赖项包括:

R1

C → A C → E C → F E → C E → D R2中都没有重要的依存关系。

由此,我们可以得出结论,两个分解都不会保留依赖性。例如,无法获得以下依赖关系(以及所有从其派生的依赖关系):

R3