这个算法本身并不难,就从那个大家都喜欢的例子来开始细说。
说对于关系模式 ,有函数依赖
要判断
是不是一个无损连接的分解;换言之,要判断是否
成立。这里的 ,所以也就是判断
是否成立。我们把等式左半边写作 ,代表 在分解 上的投影连接。
能看出来, 中的元组必定包含在 中,所以需要判断的是 中的元组必定是 中的元组。
怎么判断呢? 中的元组都是 中元组的一些局部再自然连接得来的。如果我们假设 中有一不存在于 中的元组 ,它是由什么得来的?
来自 中的各个元组的连接,比如作为 的一个元组的 ;显然, 必定是由 和类似的 、、 及 进行自然连接的结果。而 来自于 中的某个元组的投影,我们不妨称 中的这个元组为 ;对于这个元组,我们知道它在属性集 和 上的取值必定是 和 .类似地,我们可以得到其它的 所来自的元组 在各属性集上的取值:
上表中第一行代表 ,它在 上取值 ,以此类推;空下来的格子我们还不确定。如果无损连接分解不成立,那么上面的五个元组所生成的 就的确不在 中,换言之 .当然了,这个表是平凡的;如果没有函数依赖关系,对于生成 的元组们我们就只能得出这点结论。
上的函数依赖 就是说,如果 上的任两个元组在 上取值相同,则在 上必定取值相同,也就是说,对于 中的元组 ,如果我们已经知道 在 上取值 (记作 ),那么 中就不存在在 上取值 的元组的 ,使得 .换言之, 中在 上取值相同的元组,在 上的取值必定相同。 都是 中的元组,它们都必须满足函数依赖。, 和 在 上都取值 ,所以我们可以得出结论,它们在 上也取相同的值,这个值我们暂时还不知道。我们把它记作 :
再看下一个函数依赖 ,它告诉我们在 上取值相等的 和 在 上取值也相等。我们已经知道 ,所以 .
下一个函数依赖 .我们可以看到有四个元组在 上取值 ,它们在 上取的值也一定相等。但是这次,这个相等的值就不是我们不知道的值了:,也就是说其它三个元组在 上也必定取 .
从 中得出的结论是 , 和 一样,在 上取值 .我们所不知道的那个值 ,其实就是 自己!于是我们把表中所有的 都改写成 .
还有一个函数依赖 ,告诉我们 和 在 上取值 .
改写到这里我们就可以停一下,看看表中第三行的 .我们现在知道它的取值是 ,和那个不应该存在在 中的元组 的取值相同。 其实就是 本身!但是, 是 中的一个元组才对。
表中出现这样的一行,代表我们最初的假设是错误的: 中没有哪个元组不存在于 中。换言之, 中的元组必定是 中的元组。这样,我们就通过上面的步骤判断出, 是 的一个无损连接分解,这些步骤就是无损连接分解的判别算法,或者称为追踪算法(chase algorithm)。
以上的说明不太严谨,Jan Hidders 在 Quora 上给出了一个使用形式逻辑、更加严谨的解释。