我试图弄清楚如何查看分解是否保留了依赖关系。关系为:R(ABCDEF),并且具有以下FD。 AB-> CE,C-> EB,E-> D,C->D。然后将关系拆分为: R1(BF),R2(ACB)和R3(CDE)。是否保留了这种依赖关系?
我的印象是,要计算此结果,您需要对FD的所有左侧进行封闭。这给出了:
AB + = ABCEBD,其中包括AB-> CE
C + = CEBD,其中包括FD
E + = ED,其中包括E-> D
因此,在我的世界中,这就是保持依赖关系。但是,根据标记,答案是不是。对于这个概念,我在做什么错和/或误解?
为澄清起见,我确实理解每个分解关系中都不包含某些依赖项。例如AB-> E,因为我们找不到包含这三个元素的关系。但是,尽管如此,由于AB的闭包仍然包括E,因此无论如何它都将被视为保持依赖关系。这是我出问题的地方吗?对该概念的解释(我的教科书非常简短)将不胜感激。
答案 0 :(得分:0)
简短:您是正确的,依赖项已保留。
详细解释。
要定义依赖项保留的概念,我们首先需要定义一组功能依赖项的投影的概念:
给出具有一组依赖项F的架构R(T),并给定T的子集T i ,则F在T i上的投影 定义为:
π T i = {X→Y∈F + | X,Y⊆T i }
请注意,我们需要考虑F + 的依赖关系(F依赖关系的封闭),而不仅仅是F上的依赖。
我们现在可以定义依赖项保留的属性以进行分解:
A分解ρ= {R 1 (T 1 ),...,R n (T n 且仅当ifπ T i (F)≡F时,具有依赖关系F的R(T)的R(T)保留依赖关系。
这可以通过应用至少在1983年开始在书中描述的算法进行正式验证(例如,参见:Ullman,J.(1983)。数据库系统原理。计算机科学出版社,马里兰州罗克维尔),该算法可以计算多项式时间,一组属性相对于依赖项的投影是闭合的。
在实践中,为了检查示例中是否保留了依赖项,不需要应用该算法,但是足以计算出依赖项的规范覆盖范围:
A B → C
C → B
C → E
E → D
从中我们可以看到每个依赖关系都包含在分解的关系中,因此我们可以得出结论,这些依赖关系得到保留。
请注意,在对一组依赖项进行推理时,对它们进行规范的介绍总是很方便的。