我有一个理论问题。我有关系R(A,B,C,D)和依赖B-> C,B-> D。我如何检查是否属于BCNF,如果不是我如何将其分解为BCNF?问题来自一本书。我了解基础知识,但用这个我没有成功,有人可以向我解释吗?数据库关系正常化到BCNF
0
A
回答
0
首先计算关闭集合R
。
- {A} = {A}
- {B} = {B,C,d}
- {C} = {C}
- {d} = {d}
- {A,B} = {A,B,C,D} (这是
R
的关键字,因此我们不必计算任何包含关键字AB
的闭包集合 - {A,C} = { A,C}
- {A,D} = {A,D}
- {B,C} = {B,C,d}
- {B,d} = {B,C,d}
- {C,d} = {C,d}
- {A ,C,D} = {A,B,C,D}(也是一个关键字,因为它包含关闭中的所有属性
R
)。 - {B,C,d} = {B,C,d}
集如{A,B,C}并没有计算为{A,B}(密钥)是一个子集。接下来,我们必须确定新的FD(功能依赖)。我不会解释这个过程,因为我确定你的教科书会描述它。的依赖关系是:
- 乙 - “ç
- 乙 - > d
- AB - Ӎ
- AB - > d
- BC - > d
- BD - “ç
- ACD - >乙:
现在,每次在它的左s表示没有超密钥FD ide,是BCNF违规行为。我们可以使用这种违规行为来拆分关系R
。我们违反的FD是B→C,B→D,BC→D和BD→C。我们可以将关系分解为FD B→C。分裂关系的第一个“一半”将包含所有FD左侧的属性关闭元素,在这种情况下属性B
。所以我们的第一个关系将是R11(B, C, D)
。我们的第二个关系将包含FD的左侧(B
)和不属于B关闭的属性,属性A
。所以我们得到关系R12(A,B)
。现在让我们看看:关系R12
当然在BCNF中,因为它只包含两个属性。现在我们来检查关系R11
。此关系的新密钥为B
,因为B
的结尾包含R11
的所有属性。没有任何FD关于R11
有效,因为它们都在其左侧包含B
。所以这两个关系都在BCNF。我希望这对你来说已经够清楚了。
编辑:只有现在注意到这个职位是4个月前...那么我希望它仍然有用(可能是其他成员正在搜索这个主题)。
什么书是你学习BCNF,它是如何说识别BCNF,到BCNF的算法是什么,以及你在这个练习中到目前为止获得的算法,以及你卡在哪里?你正在有效地寻求一本教科书的一章。网上有很多书籍和幻灯片。请具体说明。 – philipxy