对BCNF的困惑

时间:2016-12-19 00:52:13

标签: schema functional-dependencies bcnf

架构: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不是超级钥匙?为什么不选择IJI作为超级钥匙呢? ķ

2 个答案:

答案 0 :(得分:0)

BCNF的定义要求关系R的非平凡函数依赖性不具有作为超级密钥的行列式(左侧)。超级键是属性或属性集,用于确定关系的所有属性。因此,如果至少一个依赖关系具有不是超级密钥的行列式,则该关系不在BCNF中。

在这个例子中,我们可以从任何依赖开始。我们从A → DE开始吧。我们可以通过计算它的闭包来检查A是否是超级密钥,并查看它是否包含所有属性:

A+ → A
A+ → ADE (because of A → DE)

无法添加其他属性,因此A不是R的超级密钥,且该关系不在BCNF中。

同样,我们可以看到IJG不是超级密钥。

实际上这个关系有一个唯一的候选键IJ,可以通过计算它的闭包IJ+来检查。这意味着每个超级密钥必须包含IJ

答案 1 :(得分:0)

一个人不会选择"超级钥匙。给定模式和功能依赖性,一些属性集是候选键。候选键的每个超集都是超级键。

候选键的概念通常用超级键来定义。超级键是一组确定每个属性的属性。候选键是超级键,没有适当的(较小的)子集是超级键。

定义"超级键的另一种方式"是一组属性,其中每个值的子列都是唯一的。因此,我们经常表达或认识到一组属性是一个超级键,它说它是唯一的"。

(您可以任意选择"选择"一个候选键是"主键",但这与关系理论无关。将您的选择告诉DBMS可能会影响它的作用具有讽刺意味的是,在SQL中声明为PRIMARY KEY的一组列表明它是超级键,不一定是候选键,即不一定是主键。就约束而言,它意味着UNIQUE NOT NULL 。)

当某些功能依赖项存在于模式中时,其他功能依赖项会存在。持有的是那些原件暗示每个阿姆斯特朗公理的东西。要使{A}成为超级密钥,它的某个子集必须是候选密钥。但是考虑到你的功能依赖集,{}和{A}都不是候选键。同样地,对于{I}。但{IJ},如果确定其闭包,则确定所有属性。所以这是一个超级钥匙。每个超集都是如此。由于它没有适当的子集,因此它也是候选键。