我教科书上的练习要求我们标准化与 2NF 的关系,然后标准化与 3NF 的关系。
R (ABCDEF)
F = {AD->FE, BC->E, FEA->D, AC->DE, F->E, BD->A, F->C, ABC->AEF, B->F}
按照这本书,我将功能依赖性最小化到
F = {AD->F, AC->D, BD->A, F->E, F->C, B->F}
现在我们可以找到钥匙了:
{AB}
和 {BD}
接下来,
B->F
打破了 2NF,因为非键属性依赖于键的一部分。因此,我们将关系划分为两个新表:
R1 (BFEC)
和 R2 (ABD)
我在这里迷路了。那些新表需要继承功能依赖,所以我这样做了:
F1 = {F->E, F->C, B->F}
和 F2 = {BD->A}
我试图确定哪个关系获得对属性的哪个依赖并将它们配对在一起。然而,这从原始集合中留下了两个功能依赖性:
AD->F, AC->D
如何找出在规范化过程中创建的每个新表的新功能依赖关系?
假设我们想要无损分解,以便在原始关系中保持的 FD(函数依赖)也在其中一个组件中保持,从而在它们的连接中保持。我们可以使用一个组件的 FD 属性来做到这一点,同时通过从原始组件中删除确定的属性来获取另一个组件,只要这些组件共享其中一个组件的 CK(候选键)的属性。有人会告诉你,确实如此。这里对于有问题的 FD B -> F,建议分解 {ABCDE} 和 {BF},因为公共属性集 {B} 是后者的 CK。
因此我们需要将我们的关系“划分”为两个新表: R1 = (BFEC) 且 R2 = (ABD)
考虑到这些 FD,这不是无损分解,并且不清楚您为什么认为是这样。 (共享列 {B} 不包含这些组件之一的 CK。)
(这个术语不是“划分”,而是“分解”。目前还不清楚为什么你没有使用正确的术语,而使用了另一个并不意味着这一点的术语,同时甚至使用恐吓引号来表明你知道这并不意味着,甚至没有说出你的意思。)
您不能仅将组件中的盖子中的 FD 子集作为该组件的盖子。您需要查看保存的所有原始 FD 中哪些具有组件的属性,因此保存在组件中。为什么?封面是一组 FD,意味着所有持有的 FD 而没有其他。组件中可能存在一个 FD,该 FD 不在封面中,但由封面中的 FD 组隐含。如果所有这些集合都包含其属性不在组件中的 FD,则该 FD 将不会被具有组件属性的封面 FD 的子集所隐含。因此该子集不会成为该组件的封面。
如上所述,通过拆分某些 FD 进行分解可能意味着原始版本中包含的某些重要 FD 在任一组件中都不具有其所有属性,因此在它们中不包含。 (还要注意,成立的 FD 包括列出的 FD 隐含的所有内容,由阿姆斯特朗公理给出,而不仅仅是列出的。)然后,尽管我们将进行无损分解,但我们无法检查后一个 FD 是否成立通过检查它是否包含在组件中来连接组件。这称为不保留该 FD。但事实证明,我们总是可以在保留 FD 的同时标准化为 3NF。这就是为什么我们不通过遍历较低的 NF 或随机选择 FD 来归一化为 NF(范式),而是使用专门设计的算法来获取该 NF,同时保留 FD。
查找并遵循信息建模和关系数据库教科书。 (许多内容都是免费的,还有学术幻灯片和课程。)
这是来自 Ullman 的一些幻灯片的 Bernstein 保留 FD 的 3NF“合成”算法:
给出:R 中包含的 FD 的关系 R 和覆盖 F
- 找到 C,F 的规范封面
- 对于 C 中的每个 FD X -> Y,创建与模式 XY 的关系
- 如果某个关系的模式是另一个关系的子集,则消除该关系
- 如果到目前为止创建的模式都不包含 R 的 CK,请添加包含 R 的 CK 的关系模式
由于这保留了 FD,而 3NF 意味着 2NF,因此其输出也是保留了 FD 的 2NF 模式。 (它的输出实际上是EKNF,比3NF稍强。)