0

虽然我确实了解正常形式是什么,但我在使用它们时遇到了麻烦。我正在学习数据库系统课程,不知何故我对此有点迷茫。我尝试过谷歌、stackoverflow、课程幻灯片和书籍,但例子似乎每次都让我偏离轨道。如果我在这篇文章中做出一些错误的假设/结论,我非常希望得到一些指示,但也希望得到一些关于我最终遗漏的指示。

我今天遇到的一个具体练习是:给定这个 DB,将其转换为 BCNF:

DB:  
AB -> EF  
F -> AB  
A -> CD

据我了解,这里有两个可能的候选键。AB 和 F。这是因为两者都能够导出整个 DB,并且因为它们都由单个左手边组成,所以它们都是最小的。

假设我们以 F 作为主键。
起初:DB(F->AB)

对于 1NF,似乎没有重复组。查看。
对于 2NF,似乎没有部分依赖。(如果 F 是唯一的主键,这不是不可能的吗?)
对于 3NF 有一个问题!AB 和 A 都不是键,而是确定其他属性。为了解决这个问题,它们需要成为键:(抱歉缺少下划线,似乎没有下划线的选项)

DB(F->AB)
R1(AB->EF)
R2(A->CD)

据我了解,对于 BCNF,过程如下:将 3NF DB 与原始 DB 进行比较。在 3NF DB 中找到整个左侧存在且至少存在一个右侧的原始 DB 中的出现。我不太确定怎么可能没有这个。也许我误解了这部分。无论如何,继续;

第一次出现是 F->AB。这是主键,因此可以。
第二次出现是 AB->EF。由于 AB 是候选键,因此也可以。
最后出现是 A->CD。A 只是候选键的一部分。这违反了 BCNF,必须重写。这就是我完全下车的地方。我不知道如何重写它,我不确定到目前为止的过程是否有意义。谁能帮我把它包起来?

4

1 回答 1

1

你是对的:A->CD 是违反 BCNF 的依赖项。你把你的关系一分为二:

  • 违规依赖的属性:ACD
  • 违反依赖项(A)右侧的属性以及其余属性:因此您得到 ABEF

这是您停止的地方,因为所有功能依赖项都符合 BCND 规则。

于 2014-03-24T19:09:15.057 回答