BCNF:寻找实际使用超级键而不是候选键的示例

sta*_*ken 3 database key relational-database database-normalization bcnf

Boyce-Codd 范式的定义指出所有非平凡函数依赖的决定因素必须是超键。

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

我没有想出一个只使用无法转换为使用候选键的超级键的关系。

假设我们有一个候选键和一个额外的函数依赖关系,其中一个超级键作为行列式。

R1(A,B,C)
{A}
A,B -> C
Run Code Online (Sandbox Code Playgroud)

这个额外的 FD 是多余的,因为它包含一个明显确定其他属性 (A -> C) 的候选键。

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

R2(A,B,C,D)
{A,B},{B,C}
A,B,C -> D
Run Code Online (Sandbox Code Playgroud)

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

我实际上想知道是否有没有候选键的例子。但为什么定义会比必要的更广泛?或者定义是否等效,因为依赖项总是可以转换?

Ren*_*nzo 6

关键是,在定义范式时,我们必须将其表达为一般形式,作为保持某种关系的所有函数依赖的属性。

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

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

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

由于这些原因,找到给定依赖集的规范覆盖被认为是规范化的重要第一步,即由一组依赖构成的覆盖: a) 在 rigth 部分只有一个属性;b) 左边部分没有多余的属性(即可以删除的属性,保持作为封面的属性);c) 没有冗余的依赖关系(即可以通过阿姆斯壮公理从其他人那里导出的依赖关系)。

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

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

请注意,我们正在讨论 F + 中的依赖关系,它是F的闭包,换句话说,它包含所有在 R 中持有并以某种方式从 F 派生的依赖关系。所以如果关系 R 有一个候选键 X K,显然不仅仅是 X K?例如,T 成立,但是对于 X K 的所有超集 S我们将有那个 S ? T 成立,因此范式的定义必须允许这些依赖关系。

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

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

看到不同?我们现在谈论的是 F 而不是 F +

这个定理有以下推论:

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

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