2

我只是在阅读 DBMS 中 3NF 的定义,它指出:

函数依赖 X --> A 在以下情况下是允许的: 1. X 是一个超级键。2. A 是某个键的一部分。

我有两个疑问:

答:我不明白第二个条件对消除异常有何用处。为什么有 BCNF 形式,相反我们可以定义 3NF 形式不具有第二个条件。

我得到了删除传递依赖的要点。如果 Y --> Z 和 X 是主键。然后有一个传递依赖,因为 X --> Y --> Z 意味着我们不能存储 (X,Y) 的值,除非我们知道 Z。

b: 请解释移除 3NF 中的第二个条件将如何移除异常和/或限制冗余。

4

1 回答 1

1

“如果:1. X 是超级键。2. A 是某个键的一部分,则允许函数依赖 X --> A。”

您定义的第二个条件是错误的。A应该是一个非主要属性(即它不应该是满足 3NF 的关键的一部分)。

事实上,理解3NF的更好方法是 -如果是非属性,则
给定函数依赖项,则必须超级键X->Y YX
请注意,这确保没有传递依赖

另一方面,BCNF是 -
对于每个函数依赖X->Y,左侧(X必须是一个超级键(无论右手边(Y)是素数还是非素数都没有关系)

现在你的第一个疑问

“为什么有 BCNF 形式,而不是我们可以定义 3NF 形式没有第二个条件?” 是的,如果你去掉 3NF 的第二个条件(Y应该是非主属性),那么它就等价于 BCNF。但是你为什么要这样做呢?有时你不能减少与 BCNF 的关系(因为它并不总是可以获得保持依赖关系的 BCNF 分解)然后将其减少到 3NF 至少比让它处于 2NF 更好

例如-

R=(J,K,L)
F={JK->L,L->K}

在这里,我们有 2 个候选键 -JK并且不在BCNF中。的任何分解都将无法保存。这意味着测试需要加入。所以在某些情况下——JLRRJK->LJK->L

  • BCNF 不是依赖保留,并且
  • 有效检查更新的功能依赖违规很重要

解决方案:定义一个较弱的范式,称为 3NF。总是有一个无损连接、保持依赖关系的分解为 3NF。

我真的没有得到您的第二个疑问 - “...3NF 如何消除异常和/或限制冗余”。3NF 将消除冗余购买消除任何传递依赖!

可能也有一些帮助。

于 2015-06-22T21:06:39.350 回答