BCNF:寻找实际使用超级密钥而不是候选密钥的示例
BCNF: Looking for example that actually uses superkey instead of candidate key
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
这与上面的问题完全相同。
我真的想知道是否有没有候选键的例子。但为什么定义会比必要的更广泛?或者定义是否等价,因为依赖关系总是可以转换?
关键是,在定义范式时,我们必须将其表示为一般形式,如 属性 of all 函数依赖持有一个一定的关系。
相反,当我们推理一个特定的关系模式时,我们通常只有所有函数依赖的一个子集(因为它们的数量可能太大,可能与属性数量成指数关系)。使用的特定依赖集,通常用字母 F 表示,有一个特殊的 属性:它是关系中所有依赖项的 cover,即来自它我们可以通过以所有可能的方式应用一组称为阿姆斯特朗公理的公理来导出关系的所有依赖关系。
F,与关系模式中的属性一起指定的依赖集,可以以不同的方式给出:例如,在练习中,它们可以作为练习的输入给出,在真实的数据库设计中,它们可以描述一组被认为对某个真实词域建模很重要的约束条件等。
即使它们是从关于要通过数据库建模的情况的知识中提取的,它们也可能包含其他人已经给出的暗示的依赖关系,或者可能包含冗余属性等。
由于这些原因,找到给定依赖集的规范覆盖被认为是规范化的重要第一步,即由一组依赖构成的覆盖即: a) 在右边部分只有一个属性; b) 左侧部分没有多余的属性(即可以删除的属性保持作为封面的 属性); c) 没有多余的依赖关系(即可以通过阿姆斯特朗公理从其他人那里推导出来的依赖关系)。
现在让我们考虑BCNF的一般定义:
A relation schema R<T,F> is in BCNF if and only if for each non-trivial dependency X → Y of F+, X is a superkey.
注意我们说的是F+中的依赖,也就是F的closure,换句话说就是包含 all R 中的依赖关系并以某种方式从 F 派生。因此,如果关系 R 具有候选键 XK,显然不仅例如,XK → T 成立,但是对于 XK 的所有超集 S,我们将有 S → T 成立,因此正常形式的定义 必须 允许这些依赖关系。
现在,可以根据 BCNF 的一般定义证明以下定理,该定理以某种方式简化了它(并使检查关系是否已存在于 BCNF 中的测试变得高效):
Theorem: A relation schema R<T,F> is in BCNF if and only if for each non-trivial dependency X → Y of F, X is a superkey.
看出区别了吗?我们现在说的是F而不是F+.
而这个定理有如下推论:
Corollary: A relation schema R<T,F> in which F is a canonical cover, is in BCNF if and only if for each non-trivial dependency X → A of F, X is a candidate key.
由于规范覆盖中的依赖项没有多余的属性,如果关系在 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
这与上面的问题完全相同。
我真的想知道是否有没有候选键的例子。但为什么定义会比必要的更广泛?或者定义是否等价,因为依赖关系总是可以转换?
关键是,在定义范式时,我们必须将其表示为一般形式,如 属性 of all 函数依赖持有一个一定的关系。
相反,当我们推理一个特定的关系模式时,我们通常只有所有函数依赖的一个子集(因为它们的数量可能太大,可能与属性数量成指数关系)。使用的特定依赖集,通常用字母 F 表示,有一个特殊的 属性:它是关系中所有依赖项的 cover,即来自它我们可以通过以所有可能的方式应用一组称为阿姆斯特朗公理的公理来导出关系的所有依赖关系。
F,与关系模式中的属性一起指定的依赖集,可以以不同的方式给出:例如,在练习中,它们可以作为练习的输入给出,在真实的数据库设计中,它们可以描述一组被认为对某个真实词域建模很重要的约束条件等。
即使它们是从关于要通过数据库建模的情况的知识中提取的,它们也可能包含其他人已经给出的暗示的依赖关系,或者可能包含冗余属性等。
由于这些原因,找到给定依赖集的规范覆盖被认为是规范化的重要第一步,即由一组依赖构成的覆盖即: a) 在右边部分只有一个属性; b) 左侧部分没有多余的属性(即可以删除的属性保持作为封面的 属性); c) 没有多余的依赖关系(即可以通过阿姆斯特朗公理从其他人那里推导出来的依赖关系)。
现在让我们考虑BCNF的一般定义:
A relation schema R<T,F> is in BCNF if and only if for each non-trivial dependency X → Y of F+, X is a superkey.
注意我们说的是F+中的依赖,也就是F的closure,换句话说就是包含 all R 中的依赖关系并以某种方式从 F 派生。因此,如果关系 R 具有候选键 XK,显然不仅例如,XK → T 成立,但是对于 XK 的所有超集 S,我们将有 S → T 成立,因此正常形式的定义 必须 允许这些依赖关系。
现在,可以根据 BCNF 的一般定义证明以下定理,该定理以某种方式简化了它(并使检查关系是否已存在于 BCNF 中的测试变得高效):
Theorem: A relation schema R<T,F> is in BCNF if and only if for each non-trivial dependency X → Y of F, X is a superkey.
看出区别了吗?我们现在说的是F而不是F+.
而这个定理有如下推论:
Corollary: A relation schema R<T,F> in which F is a canonical cover, is in BCNF if and only if for each non-trivial dependency X → A of F, X is a candidate key.
由于规范覆盖中的依赖项没有多余的属性,如果关系在 BCNF 中,每个行列式(函数依赖项的左侧)显然是候选键(不是通用超级键),这解释了有时我们在书上找到的定义和例子之间的区别。