7

假设关系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} 我们使用函数依赖,这在我看来不是无损的,但有点混乱。

4

3 回答 3

20

如果我们稍微解开无损分解的概念会有所帮助:它实际上只是意味着加入 R1、R2 和 R3 应该会产生原始的 R。

你知道追逐测试又名“画面法”吗?这是一个很酷的算法来测试无损。它易于编程,并且在行业中用于推理数据一致性时。

我们从所谓的“分解表”开始,一个 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

我们完成了!一旦任何行具有所有适当的属性(如第一行那样),算法就会终止并证明分解确实是无损的。

请注意依赖项的重复应用如何表示在它们共享的键上加入关系。所以我们所做的是将 R1 和 R2 在 L 和 M 上连接起来(将我们 (K, LM, N) 连接起来),然后将结果与 R3 在 K 和 M 上连接起来(产生 R)。

于 2014-05-13T15:12:04.040 回答
1

上面提到的算法是正确的,但计算是错误
的,因为 R1 包含 K, L, M 而不是 K, L, P
所以这里在第二步 LM --> N 将被使用
,它将在 R1 中将 N1 变为 N
然后 MP - -> 将使用 K,R1 将包含 R 的所有属性,
因此算法将终止。

于 2014-12-28T15:47:44.127 回答
0

当你有很多属性时,tableau 方法不是那么酷,也不是一个有前途的方法。相反,我主张这种方法,

一般来说,如果将 R 分解为 R1 和 R2,则 R1 Intersect R2 ->R1 或 R1 Intersect R2 ->R2 应该为真。

因此,当它是 R1、R2、R3 .. Rn 时,首先检查它们中的任何两个是否相同,并在给定的功能依赖关系的帮助下将其简化为 R。检查 (Rn U Rn-1) 是否无损分解为 Rn-1 和 Rn,如果是,则将 Rn-1 替换为 (Rn U Rn-1),丢弃 Rn 并继续检查直到完成连接。

如果否,则返回 False。

于 2019-04-16T20:35:06.610 回答