标准化后的函数依赖关系

问题描述 投票:0回答:1

我教科书上的练习要求我们标准化与 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

如何找出在规范化过程中创建的每个新表的新功能依赖关系?

relational-database database-normalization functional-dependencies
1个回答
2
投票

假设我们想要无损分解,以便在原始关系中保持的 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

  1. 找到 C,F 的规范封面
  2. 对于 C 中的每个 FD X -> Y,创建与模式 XY 的关系
  3. 如果某个关系的模式是另一个关系的子集,则消除该关系
  4. 如果到目前为止创建的模式都不包含 R 的 CK,请添加包含 R 的 CK 的关系模式

由于这保留了 FD,而 3NF 意味着 2NF,因此其输出也是保留了 FD 的 2NF 模式。 (它的输出实际上是EKNF,比3NF稍强。)

© www.soinside.com 2019 - 2024. All rights reserved.