bcnf范式,bcnf
3.5范式——bcnf范式到底是什么呢?
对于bcnf范式,通过查阅资料,我的理解是——主键依赖的去除。比如说:一个仓库管理的表格,有以下属性(管理员编号,仓库号,货物编号,货物数量)其中每个管理员管理一个仓库,那么就会出现这样的情况:
1.仓库号和货物编号可以确定货物数量,仓库号和货物编号可以确定管理员编号。
2.管理员编号和货物编号可以确定仓库号,管理员编号和货物编号可以确定货物数量。
3.仓库号可以确定管理员编号。
4.管理员编号可以确定仓库号。
其中,仓库号、管理员编号和货物编号都是主属性,数量是非主属性,它们的关系符合三范式。但是它不是bcnf,因为在主属性中,仓库号可以推出管理员编号,管理员编号可以推出仓库号。他们之间存在传递依赖。这是不符合bcnf的。
做法是,把表格拆分,得到如下结果:表一(仓库号,管理员编号);表二(管理员编号,货物编号,数量)。
但是,有的bcnf范式会导致关系的丢失。比如:有个表示工厂工人计件的表格(车间号,工人编号,零件号,数量)其中的关系是:
1. 一个工人只能在一个车间工作,一个车间有多名工人。
2. 一个工人生产多种零件,一个车间内的零件没有重复。
其中,车间号、工人工号和零件号都是主属性,数量是非主属性,它们的关系符合三范式。但是“车间号”+ “零件号”可以推出“工人工号”然后“工人工号”可以推出“车间号”,他们主属性之间有传递依赖,这样的话是不符合bcnf范式的。
分解的办法是:将表格拆分成两个表格——表一(职工号,零件号,数量);表二(职工号,车间号)。这样分解会将“车间号+零件号”推出“工人工号”的关系丢失。
3.5范式已经搞定,接下来就是第四范式。
不是,而是X必含有候选码,候选码与码在这里是一个概念。
X确定Y,X未必是一个属性,也可能是一组属性的,但这组里不能含有Y,否则(x,y)->y什么也说明不了的!因为y->y,增广率(x,y)->y,所以这里说X不能含Y或称Y不在X内。例如U是码,则x一定要包含U,如(u,z)->y则X一定要含有码的。但如果出现这种情况这不是了,U是(a,b),而x是(b,c,d)则X->Y,那么,x中因为没有(a,b)所以x不含码,那么一定不是BCNF!
其实这个BCNF的概念是在1NF上下的定义。如果在1NF中用否定方式下定义的话是:X决定于Y,Y不包含于X,X若不存在码,则该一定不是BCNF.
当然还可以在第三范式下一个定义,关系属于第三范式,X是码的真子集,若不存在X->Y则关系属于BCNF。
BCNF是第三范式的修改正,但不是消除传递依赖的,这点楼下错了,而是消除部分依赖的!也就是说非码属不能依赖于码的一部分。如果(a,b,c)是码,若存在(a,b)这个部分能确定一个非码属性时,则不符合BCNF!
消除传递依赖是第二范式向第三范式规范的一个条件。在第二范式的基础上,不存在依赖传递,则属于第三范式!呵呵,有人学艺不精!
关系模式中如果每一个决定因素都包含码,那么这个关系就是BCNF范式
在你的例子中,应该是(WNO,PNO)是主码,所以它能决定其他的属性,就是说只要一个元组中给定了(WNO,PNO)那么它的QNT也就决定了(查表的时候)