1
数据库原理与应用技术
1.4.3.4 3.3.4 BCNF
3.3.4 BCNF

【例3-10】设有关系模式STC(S, T, C),其属性含义为:S表示学生,T表示教师,C表示课程。语义假设:每位教师仅教一门课;每门课有若干教师任教;某一学生选定某门课,就对应于一位确定的教师。

解:(1) 根据语义,关系模式STC的函数依赖为(S, T)→C,T→C。

(2) 显然,(S, C)和(S,T)都可以作为候选关键字,STC中不存在非主属性对关键字的部分依赖和传递依赖,STC属于第三范式。

(3) 考察STC的某一关系r,如表3-4所示。

表3-4 关系r

在这个关系中仍然存在如前所述的数据冗余、插入异常、删除异常等数据库异常问题,而出现问题的根本原因在于STC的函数依赖集,(S, T)→C,T→C,也就是C部分依赖于(S, T)。

关系模式R(U,F)∈INF,若x→y,且y x,必含有码,则称关系R是BCNF的,记为R∈BCNF。

简言之,若R中每一非平凡函数依赖的决定因素都包含一个候选码,则

R∈BCNF

结论 一个满足BCNF的关系模式应有如下性质。

(1) 所有非主属性对每个码都是完全函数依赖。

(2) 所有主属性对每个不包含它的码,也是完全函数依赖。

(3) 没有任何属性完全函数依赖于非码的任何一组属性。

例3-10中STC(S, T, C)可以分解为S1(S,T)和S2(T,C)来消除数据库设计的异常问题。

一个关系分解成多个关系,要使分解有意义,起码的要求是分解后不丢失原来的信息。纵观上述所有关系异常原因,发现所有的异常来自于同一个关系描述了多个实体或联系。那么关系规范化的过程就是合理分解关系的过程,是概念单一化的过程,是把不适当的属性依赖转化为关系联系的过程。当建立和设计数据库应用系统时,要牢记概念单一化的原则,也就是一个关系反映一个对象(实体或联系),每个关系的所有属性都是对同一个对象的描述。但要注意一个问题,在必要时必须附加一些属性作为外码使用,因为还要保证关系的无损连接性,而这正是通过外码实现的。

数据库规范化的程度越高,越能够减少数据冗余和操作异常,关系也分解得越细越多。但要注意,不是规范化程度越高越好。当进行查询时,若查询内容涉及两个或多个关系模式的属性,系统需要经常做连接运算,而连接运算过多将影响系统运行的效率,也就是降低了查询速度,所以对经常需要查询使用的数据,有时可以采用较低的规范化,从而带来较高的查询效率。因此在这种情况下,第三范式、第二范式甚至是第一范式也许是最好的。非BCNF的关系模式虽然从理论上分析会存在不同程度的数据冗余和更新异常,但如果在实际应用中对此关系模式只是查询,并不执行更新操作,那么不会产生实际影响。所以对一个具体应用来说,到底规范化进行到什么程度,这要求数据库设计人员要充分了解数据库未来应用的情况,权衡利弊,选用较合适的规范化程度。一般而论,规范到第三范式足够了。

例如,学生成绩信息(学号,姓名,高等数学,英语,C语言,平均成绩)的关系模式中存在函数依赖:学号→高等数学,学号→英语,学号→C语言,(高等数学,英语,C语言)→平均成绩,显然有学号→(高等数学,英语,C语言),该关系模式存在传递函数依赖。虽然平均成绩可以由其他属性推算出来,但如果应用中需要经常查询学生的平均成绩,为提高效率,仍然可保留该冗余数据,对关系模式不再做进一步的分解。