架构:R(A,B,C,D,E,F,G,H,I,J)
和功能依赖FD = { A->DE, IJ->H, I->A, J->FG, G->BC }
问题: BCNF中有关系吗?
答案:这不是因为A
不是超级密钥。
我知道BCNF中的条件关系是什么,但是让我一直困惑的是superkey
。谁能解释为什么答案A
不是超级钥匙?为什么不选择IJ
或I
作为超级钥匙呢? ķ
答案 0 :(得分:0)
BCNF的定义要求关系R
的非平凡函数依赖性不具有作为超级密钥的行列式(左侧)。超级键是属性或属性集,用于确定关系的所有属性。因此,如果至少一个依赖关系具有不是超级密钥的行列式,则该关系不在BCNF中。
在这个例子中,我们可以从任何依赖开始。我们从A → DE
开始吧。我们可以通过计算它的闭包来检查A
是否是超级密钥,并查看它是否包含所有属性:
A+ → A
A+ → ADE (because of A → DE)
无法添加其他属性,因此A
不是R
的超级密钥,且该关系不在BCNF中。
同样,我们可以看到I
,J
和G
不是超级密钥。
实际上这个关系有一个唯一的候选键IJ
,可以通过计算它的闭包IJ+
来检查。这意味着每个超级密钥必须包含IJ
。
答案 1 :(得分:0)
一个人不会选择"超级钥匙。给定模式和功能依赖性,一些属性集是候选键。候选键的每个超集都是超级键。
候选键的概念通常用超级键来定义。超级键是一组确定每个属性的属性。候选键是超级键,没有适当的(较小的)子集是超级键。
定义"超级键的另一种方式"是一组属性,其中每个值的子列都是唯一的。因此,我们经常表达或认识到一组属性是一个超级键,它说它是唯一的"。
(您可以任意选择"选择"一个候选键是"主键",但这与关系理论无关。将您的选择告诉DBMS可能会影响它的作用具有讽刺意味的是,在SQL中声明为PRIMARY KEY的一组列表明它是超级键,不一定是候选键,即不一定是主键。就约束而言,它意味着UNIQUE NOT NULL 。)
当某些功能依赖项存在于模式中时,其他功能依赖项会存在。持有的是那些原件暗示每个阿姆斯特朗公理的东西。要使{A}成为超级密钥,它的某个子集必须是候选密钥。但是考虑到你的功能依赖集,{}和{A}都不是候选键。同样地,对于{I}。但{IJ},如果确定其闭包,则确定所有属性。所以这是一个超级钥匙。每个超集都是如此。由于它没有适当的子集,因此它也是候选键。