虽然我确实了解正常形式是什么,但我在使用它们时遇到了麻烦。我正在学习数据库系统课程,不知何故我对此有点迷茫。我尝试过谷歌、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,必须重写。这就是我完全下车的地方。我不知道如何重写它,我不确定到目前为止的过程是否有意义。谁能帮我把它包起来?