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