Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 分解成BCNF_Database_Normalization_Database Normalization_Decomposition_Bcnf - Fatal编程技术网

Database 分解成BCNF

Database 分解成BCNF,database,normalization,database-normalization,decomposition,bcnf,Database,Normalization,Database Normalization,Decomposition,Bcnf,虽然我确实理解范式是什么,但我在处理它们时遇到了困难。我正在学习一门数据库系统的课程,不知怎么的,我对这门课程有点迷茫。我试过谷歌、stackoverflow、幻灯片当然还有这本书,但这些例子似乎每次都让我偏离了正轨。如果我在这篇文章中做出了一些错误的假设/结论,我非常希望得到一些指点,但也希望得到一些关于我最后遗漏了什么的指点 我今天遇到的一个具体练习是: 给定此DB,将其转换为BCNF: DB: AB -> EF F -> AB A -> CD 据我所知,这里

虽然我确实理解范式是什么,但我在处理它们时遇到了困难。我正在学习一门数据库系统的课程,不知怎么的,我对这门课程有点迷茫。我试过谷歌、stackoverflow、幻灯片当然还有这本书,但这些例子似乎每次都让我偏离了正轨。如果我在这篇文章中做出了一些错误的假设/结论,我非常希望得到一些指点,但也希望得到一些关于我最后遗漏了什么的指点

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

DB:  
AB -> EF  
F -> AB  
A -> CD
据我所知,这里有两个可能的候选键。AB和F。这是因为两者都能够推导出整个DB,并且都是最小的,因为它们由一个左手边组成

假设我们使用F作为主键。
原来:
DB(F->AB)

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

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

第一次出现的是F->AB。这是主键,因此可以。
第二次出现是AB->EF。因为AB是一个候选密钥,所以这也可以。

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

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

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

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

谢谢您的回答!我很高兴做对了事情。你能解释一下为什么像这样分裂关系是一个“答案”吗?我想我有点搞不清楚答案到底是什么样子以及为什么。这就是BCNF分解算法的工作原理。我用了H.Garcia Molina,J.Ullman和J.Widom的《数据库系统:全集》,不过你可以看看。谢谢。我会看一看,“假设我们用F作为主键。”不,我们不要。评估每个候选键的依赖性,而不仅仅是主键。
DB(F->AB)
R1(AB->EF)
R2(A->CD)