首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分解为BCNF

分解为BCNF
EN

Stack Overflow用户
提问于 2014-03-24 16:30:19
回答 1查看 1K关注 0票数 0

虽然我知道正常的形式是什么,但我在工作中遇到了困难。我正在学习数据库系统的课程,不知怎么的,我有点迷失了方向。我试过谷歌,堆叠溢出,幻灯片的课程和书,但例子似乎使我偏离轨道,每次。如果我在这篇文章中做了一些错误的假设/结论,我非常想要一些指点,但也想要一些关于我到底错过了什么的建议。

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

代码语言:javascript
复制
DB:  
AB -> EF  
F -> AB  
A -> CD

据我所知,这里有两个可能的候选密钥。这是因为两者都能导出整个DB,因为两者都是极小的,因为它们都是由单个左手边组成的。

假设我们用F作为主键。

最初:DB(F->AB)

对于1NF,似乎没有重复组。检查一下。

对于2NF,似乎不存在部分依赖关系。(如果F是唯一的主键,这不是不可能的吗?)

对于3NF,有一个问题!AB和A都不是键,而是决定其他属性的。要解决这个问题,他们需要成为关键:(抱歉,没有下划线,似乎没有选择下划线)

代码语言:javascript
复制
DB(F->AB)
R1(AB->EF)
R2(A->CD)

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

第一次出现在F->AB。这是主键,因此可以。

其次为AB->EF。因为AB是候选键,这也可以。

最后一次出现是A->CD。A只是候选密钥的一部分。这违反了BCNF,必须重写。这就是我完全下火车的地方。我不知道该如何重写,我也不确定到目前为止这个程序是否有意义。有人能帮我把它包起来吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-24 19:09:15

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

  • 违反者的属性:
  • 违反依赖关系(A)的右侧属性以及其余属性:这样您就可以得到ABEF

这是停止的地方,因为所有的函数依赖符合BCND规则。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22615161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档