鉴于这些功能依赖性
R: {A,B,C,D,E,F}
AC->EF
E->CD
C->ADEF
BDF->ACD
我把它作为规范的封面:
E->C
C->ADEF
BF->C
然后将其分解为Boyce Codd Normal Form:
Relation 1: {C,A,D,E,F}
Relation 2: {B,F,C}
我认为这是无损和依赖保留?但是这是真的,因为从原始的功能依赖性BDF-> ACD不再是我的任何关系。但是,如果我从计算出的规范封面出发,那么我的所有功能依赖都会被保留下来。
所以问题是:这个分解是否保留了BCNF依赖?
当且仅当依赖关系在分解关系上的投影的并集是关系的依赖关系的覆盖时,分解才保留依赖关系。
因此,要知道分解是否保留依赖关系,检查特定封面的依赖关系是否已被保留是不够的(例如,通过查看某些分解关系是否具有依赖关系的所有属性)。例如,在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
,所以从他们的联盟你也可以得到C→A
。
即使存在执行该任务的多项式算法,该检查也不简单(例如,在J.Ullman,Principles of Database Systems,Computer Science Press,1983中描述了一种)。
假设您提供的依赖关系形成了关系依赖关系的封面,那么您找到的规范封面是不正确的。实际上BF -> C
不能从原始依赖项派生。
由于这个原因,你的分解是不正确的,因为R2(BCF)
不在BCNF中(实际上,它不在2NF中)。
R
的一个可能的规范封面如下:
BDF → C
C → A
C → E
C → F
E → C
E → D
在分析算法之后,BCNF中存在两种可能的分解(根据选择用于消除的依赖性)。一个是:
R1 = (ACDEF)
R2 = (BC)
而另一个是:
R1 = (ACDEF)
R3 = (BE)
(请注意,BC
和BE
是原始关系的候选键,与BDF
一起)。
R1
中依赖关系的封面是:
C → A
C → E
C → F
E → C
E → D
虽然在R2
和R3
都没有非平凡的依赖关系。
由此,我们可以得出结论,两个分解都不会保留依赖关系;例如,无法获得以下依赖项(以及从中派生的所有依赖项):
BDF → C