database - 如何确定完成 3NF 的正确步骤?

标签 database computer-science functional-dependencies 3nf bcnf

这是教科书中的一个例子: 考虑关系 R (A ,B ,C ,D ,E ) 与 FD 的 AB -> C, C -> B,A -> D。

我们知道关键是 ABE 和 ACE。分解:ABE+=ACE+=ABCDE。

你如何检查最小化?我知道AB+=ABD,教科书上也是这么说的,因为AB+不包括C。那么它是极小的。 C+=AB 和 A+=AD 也是极小的。但我不知道为什么。 如何检查最小化?

此外,我们是否必须找到除了给定的 FD 之外的所有 FD 来检查是否执行 3-NF?

然后我们检查 AB -> C 是否可以拆分为 A -> C 和 B -> C,我们注意到它们不能独立存在,因此 AB -> C 不可拆分。

我们剩下最终关系:S1(ABC)、S2(BC)、S3(AD) 和 key (因为不存在)S4(ABE)(或 S4(ABC))。然后我们删除 S2,因为它是 S1 的子集。

如果它在 3NF 中并且没有违规,那么为什么他们将原始关系拆分为:S1(A, B, C)、S2(A, D) 和 S4(A, B, E)。

书名和页码:Ullman 的数据库系统第 103 页

最佳答案

How do you check minimality?

作者在这里没有使用极简这个词。要检查最小基,请按照示例 3.27 前两段中的过程进行操作。归结为

  • “...验证我们无法消除任何给定的依赖关系。”
  • “...验证我们不能从左侧删除任何属性。”

Also, do we have to find all the FD's besides the ones given to check whether to perform 3-NF or not?

这个问题真的没有意义。 3NF 不是你执行的。教科书中的示例与 3NF 模式的综合算法有关。合成算法将关系 R 分解为至少在 3NF 中的关系。

综合算法对您提供的 FD 进行操作。在学术环境中,正如您可能会在教科书中发现的那样,假设您已获得足够的信息来解决问题。在实际应用程序中,您可能会从业务分析师那里获得一组 FD。不要假设分析师已经给了你足够的信息;寻找更多的 FD。

We then check if AB -> C can be split into A -> C and B -> C, we notice that these do not stand on their own so AB -> C is not splittable.

没有。您验证(不是注意)您不能从左侧消除任何属性。消除 A 留下 B->C;消除 B 留下 A->C。三个原始 FD 均未暗示这些。所以你不能从左侧消除任何属性。

If [the original relation] is in 3NF and there are no violations . . .

原始关系在 3NF 中。它甚至不在 2NF 中。 (A->D)

关于database - 如何确定完成 3NF 的正确步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42496786/

相关文章:

MySQL - 在左连接中使用不带Where的计数

compiler-construction - 如何为这段代码创建无分支代码?

database-design - 无损分解与依赖保留

database - 函数依赖的规范覆盖

scala - Scala 中可通过 FoldLeft 读取 FoldRight

Java 在单独的行上打印数据库记录

MySQL 5.5.57 数据库设计建议请求数据库中的 'user' 表

python - ZODB python 数据库与 Filestorage : why do temporary files stay on the disk?

computer-science - David Wheeler 的格言中的 "level of indirection"是什么意思?

algorithm - 为什么我在 Scala 中的二进制搜索实现如此缓慢?