Join 函数依赖的无损连接与分解
假设关系Join 函数依赖的无损连接与分解,join,database-normalization,relational-algebra,functional-dependencies,lossless,Join,Database Normalization,Relational Algebra,Functional Dependencies,Lossless,假设关系R(K,L,M,N,p),保持R的函数依赖关系为: - L -> P - MP -> K - KM -> P - LM -> N 假设我们将其分解为3个关系,如下所示: - R1(K, L, M) - R2(L, M, N) - R3(K, M, P) 我们如何判断这种分解是否是无损的? R1∩ R2={L,M},R2∩ R3={M},R1∩ R3={K,M}我们使用函数依赖,在我看来这不是无损的,而是有点混乱 如果我们稍微解开无损分解的概念
R(K,L,M,N,p)
,保持R
的函数依赖关系为:
- L -> P
- MP -> K
- KM -> P
- LM -> N
假设我们将其分解为3个关系,如下所示:
- R1(K, L, M)
- R2(L, M, N)
- R3(K, M, P)
我们如何判断这种分解是否是无损的?
R1∩ R2={L,M},R2∩ R3={M},R1∩ R3={K,M}我们使用函数依赖,在我看来这不是无损的,而是有点混乱 如果我们稍微解开无损分解的概念,这会有所帮助:它实际上只是意味着将R1、R2和R3连接起来应该产生原始的R 你知道测试a.k.a“表格法”吗?这是一个测试无损性的很酷的算法。它很容易编程,而且在行业中,在推理数据一致性时实际上也使用了它 我们从所谓的“分解表”开始,一个n*m矩阵,其中n是关系数,m是属性数。对于每个字段,如果关系n包含属性m,则写入属性名称;否则,我们将用关系的编号下标属性名
| K L M N P
-----------------------
1 | K L M n1 p1
2 | k2 L M N p2
3 | K l3 M n3 P
现在,该表将被“追踪”(因此该算法的名称)。我们注意到第一行和第二行的L和M值一致。依赖项LM->N意味着它们的N值也应该一致。让我们将第一行的n1更改为第二行的N:
| K L M N P
-----------------------
1 | K L M N p1
2 | k2 L M N p2
3 | K l3 M n3 P
现在,第一行和第三行的K和M值一致。我们有一个KM->P依赖关系,所以他们也应该同意他们的P值
| K L M N P
-----------------------
1 | K L M N P
2 | k2 L M N p2
3 | K l3 M n3 P
我们完了!只要任何一行具有所有正确的属性(如第一行),算法就会终止,并证明分解确实是无损的
请注意,依赖项的重复应用程序如何表示在它们共享的键上连接关系。所以我们所做的是在L和M上连接R1和R2(将我们(K,lm,N)进行净额结算),然后在K和M上连接R3的结果(产生R)。上述算法是正确的,但计算是错误的
因为R1包含K,L,M而不是K,L,P
因此,在第二步中,将使用LM-->N
它将使R1中的N1变为N
然后将使用MP-->K,R1将包含R的所有属性
因此,算法将终止。当您有很多属性时,tableau方法并没有那么酷,也不是一个有前途的方法。相反,我主张这种方法 通常,如果R分解为R1和R2, R1与R2相交->R1 或者R1相交R2->R2应该为真 所以,当它是R1,R2,R3。。Rn,首先检查任意两个函数是否相同,并在给定函数依赖关系的帮助下将其缩减为R。 检查(Rn U Rn-1)是否有无损分解为Rn-1和Rn, 如果是,用(Rn U Rn-1)替换Rn-1,丢弃Rn并继续检查,直到完成连接
如果否,则返回False“哦,谢谢,我完全忘记了,停止等待帮助:”干净的答案。考虑上述计算真实,R1应被视为(k,l,p)而不是(k,l,m)example@SRK对我一直想回到这一点并纠正答案,但似乎从来没有找到时间或心态。您想编辑吗?:)@SaT:编辑已完成,但有待同行审查。所以DjMix必须批准它。@SRK实际上,错误在我的答案中,而不是在问题中。Vivek Pandya给出的答案计算正确。为了便于阅读,请将这句话分成小块!该测试仅适用于二进制分解。但有些分解有两个以上的分量,其中成对连接进行重建是单独有损的,但最终结果不是。这些并不是唯一有效的FD,因为根据阿姆斯特朗的公理,当它们有效时,有一些微不足道的FD&FD必须有效。所以你可能被告知那是一个封面。如果你不知道这是个幌子,你就不能回答这个问题。