鉴于这些功能依赖性
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依赖关系的分解?
答案 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)
和BC
与BE
一起是原始关系的候选键)。
BDF
中的依赖项包括:
R1
在C → A
C → E
C → F
E → C
E → D
和R2
中都没有重要的依存关系。
由此,我们可以得出结论,两个分解都不会保留依赖性。例如,无法获得以下依赖关系(以及所有从其派生的依赖关系):
R3