如果我们稍微解开无损分解的概念会有所帮助:它实际上只是意味着加入 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)。