BCNF:寻找一个实际使用超级密钥而不是候选密钥的例子


Boyce–Codd范式的定义指出,所有非平凡函数依赖的行列式都必须是超键。

我在BCNF中找到的所有关系示例都使用了候选密钥。我正在寻找一个例子,它实际上有一个超级键作为行列式,而不是候选键。

我没有想出一个只使用超级键的关系,而超级键不能转换为使用候选键。

假设我们有一个与候选键的关系,以及一个以超级键为行列式的附加函数依赖。

R1(A,B,C)
{A}
A,B -> C

这个额外的FD是多余的,因为它包含一个明显决定另一个属性(A->C)的候选密钥。

尝试用两个候选密钥构建另一个示例也是无用的。

R2(A,B,C,D)
{A,B},{B,C}
A,B,C -> D

这与上面的问题完全相同。

实际上,我想知道是否有一个没有候选密钥的例子。但是,为什么定义会过于宽泛呢?或者定义是等价的,因为依赖关系总是可以转换的?

重点是,当定义一个范式时,我们必须用一个通用形式来表示它,作为所有函数依赖项在某个关系上的属性。

相反,当我们对一个特定的关系模式进行推理时,我们通常只有所有函数依赖项的一个子集(因为它们的数量可能太大,可能与属性的数量呈指数关系)。所使用的特定依赖项集,通常用字母F表示,具有一个特殊的性质:它是关系中所有依赖项的覆盖,也就是说,从中我们可以通过以所有可能的方式应用一组公理来导出关系的所有依赖项,称为Armstrong公理。

F、 与关系模式中的属性一起指定的依赖关系集可以用不同的方式给出:例如,在练习中,它们可以作为练习的输入,在真实的数据库设计中,它们能够描述一组被认为对建模某个真实单词域很重要的约束,等等。

即使它们是从关于通过数据库建模的情况的知识中提取的,它们也可能包含其他已经给定的依赖项,或者可能包含冗余属性等。

由于这些原因,找到给定依赖项集的规范覆盖被认为是规范化的重要第一步,即由一组依赖项组成的覆盖,这些依赖项:a)在右部分上只有一个属性;b) 左边部分没有多余的属性(即可以移除的属性,保持封面的属性);c) 不具有冗余依赖关系(即可以通过Armstrong公理从其他依赖关系中导出的依赖关系)。

现在让我们考虑BCNF的一般定义:

关系模式R<T、 F>在BCNF中当且仅当对于每个非平凡依赖X→F+的Y,X是一个超键。

注意,我们谈论的是F+中的依赖关系,这是F的闭包,换句话说,它包含所有保持在R中并以某种方式从F导出的依赖关系。因此,如果关系R有一个候选密钥XK,显然不仅XK→例如,T成立,但对于XK的所有超集S,我们将有S→T成立,因此正规形式的定义必须允许这些依赖关系。

现在,根据BCNF的一般定义,可以证明以下定理,在某种程度上简化了它(并使检查关系是否已经在BCNF中的测试变得有效):

定理:一个关系模式R<T、 F>在BCNF中当且仅当对于每个非平凡依赖X→X是一个超键。

看到区别了吗?我们现在谈论的是F,而不是F+

这个定理有以下推论:

推论:一个关系模式R<T、 F>,其中F是规范覆盖,在BCNF中当且仅当对于每个非平凡依赖X→F,X的A是候选密钥。

由于规范覆盖中的依赖项没有多余的属性,如果关系在BCNF中,则每个行列式(函数依赖项的左手边)显然都是候选键(而不是通用超键),这解释了定义与我们有时在书中发现的示例之间的差异。

最新更新