我们可以直接将关系规范化为3NF而不首先归一化为2NF吗?

时间:2012-12-15 14:09:50

标签: database-normalization

我有一份应该明天提交的作业 我正常地了解规范化概念,但在某些问题上我遇到了困难。 我应该如何将其标准化为BCNF?你能告诉我们这些步骤吗?

R(A,B,C,D,E,F,H)

FD set

A->D
AE->H
DF->BC
E->C
H->E

对于这个实现我必须找到键并标准化为BCNF ..  如果我归一化到2NF,我会松开一些不适合3NF的关系。所以我很困惑。 任何帮助将不胜感激..

谢谢

3 个答案:

答案 0 :(得分:0)

数据库有三种基本要求,处于第三范式:

  • 已满足1NF和2NF
  • 的要求
  • 删除不完全依赖主键的列。

如果你在2NF中正常化,你不会失去任何关系,而是你会得到另一种关系。 好的,现在让我们做好功课。

让我们假设您的关系已经在1NF。 现在为2NF

R1 = AE -> {H}(AE->H)
R2 = DF -> {B, C}(DF->BC)
R3 = A  -> {D}(A->D)
R4 = E -> {C}(E->C)

上述关系是2NF,非主要属性都不是部分依赖于候选键。而且在3NF也因为关系中没有传递关系。

现在对BCNF来说,除了R1之外,所有关系都遵循BCNF,因为H-> E关系在R1中保持,而H不属于R1中的候选键。

例如,Beeri和Bernstein在1979年表明,通过保留原始表中所包含的依赖关系,BCNF模式不能表示一组功能依赖性{AB→C,C→B}。请阅读wiki了解更多详情。

但你仍然可以把它转换成BCNF,

R1 = A -> {E}
R2 = E -> {H}
R3 = DF -> {B, C}
R4 = A  -> {D}
R5 = E -> {C}

但上述表格不符合原始关系AE-> H,使它不一致,并且通过保留原始表中保存的依赖关系,这种关系是BCNF无法实现的。

答案 1 :(得分:0)

要回答这个问题,而不是你对它的描述,是的,你可以在1NF到3NF的范围内进行标准化,而不会在此过程中停止 2NF。

一个常见的误解是你可以从1NF和

中的关系开始
  • 将它们规范化为2NF 而不是更高,然后
  • 将它们规范化为3NF 而不是更高,然后
  • 将它们规范化为BCNF 而不是更高

这很常见,但仍然是一种误解。您可以在任意数量的教科书中看到这种误解的反例,但您必须仔细查看他们的示例。据我所知,没有教科书明确地识别这种误解,但是如果你研究他们的例子就很明显了。

在实践中,通常一步到1NF或2NF到5NF或6NF。例如,从2NF到5NF只意味着你删除了一个传递依赖,并且

  • 您发现没有剩余的依赖关系,其中左侧是候选键(BCNF需要),
  • 您找不到剩余的多值依赖项(4NF需要)和
  • 您发现没有剩余的连接依赖项(5NF需要)。

这在StackOverflow的示例中发生了 lot 。 (2NF到5NF或6NF,即。)


在您使用的乐谱中表达的作业问题中,您应该假设起始关系是1NF。你的第一份工作是识别钥匙。为什么?因为除非你能识别出部分密钥依赖关系,否则你无法规范化为2NF,除非你知道所有候选密钥,否则你不能那个

将钥匙识别为AEF和AFH是正确的。由于依赖性之一是A-> D,因此关系R不在2NF中。 D仅取决于A,A是候选键的部分。要标准化为2NF,请标识所有部分键依赖关系,并通过投影消除它们。

从这开始。

  • R(ABCDEFH),按键{ AEF,AFH }

删除部分密钥依赖关系A-> D.

  • R 1 (ABCEFH),按键{ AEF,AFH }
  • R 2 A D)

R 2 是6NF。

从R中删除该部分密钥依赖关系导致R 1 。函数依赖性DF-> BC不适用于R 1 ,因为R 1 不包含属性D.但是DF-> BC仍然 适用于整体设计。这是令你困惑的一点。

大多数情况下,功能依赖最终成为简单的键约束。这就是当FD A-> D变为R 2 时发生的情况。但由于投影分割了DF-> BC的左侧, 依赖必须以不同的方式表达 - 作为数据库约束。 (SQL并不擅长.CREATE ASSERTION应该涵盖那些基础,但还没有人实现它。)

答案 2 :(得分:0)

从这开始。

R(ABCDEFH),键{AEF,AFH}
删除部分密钥依赖性A-> D和E-> C。

R1(ABEFH),键{AEF,AFH}
R2( A D)
R3( E C)

R1,R2和R3为2NF。

从R中删除该部分密钥依赖关系会导致R1。功能依赖性DF-> BC不适用于R1,因为R1不包含属性D.但DF-> BC仍然适用于整体设计。这是令你困惑的一点。

在这里,我继续迈克的评论。

您必须注意,即使R1不包含属性D,R1也包含A.如AF-> DF-> BC,依赖DF-> BC仍保留在R1中。

对于3NF,我们需要删除传递依赖性DF-> B和DF-> C,我们得到:

R1(AEFH),键{AEF,AFH}
R2( A D)
R3( E C)
R4( D F B C)

所有关系都在3NF。