电子商务数据库技术(第3版)
上QQ阅读APP看书,第一时间看更新

3.2 数据库设计中关系范式的应用

前面提到的关系模式规范化的过程是:假定先用某种方法得到一个关系数据库模式,然后分析和确定这个数据库模式中的所有存在的函数依赖及多值依赖关系,再用介绍的方法相对机械地进行关系模式的分解,消除关系模式中的一些不适当的函数依赖关系,从而将关系数据库模式规范化。理论上的做法如此,而在实际应用中并非完全这样做,主要原因如下。

(1)复杂的关系模式。找出关系模式中所有的函数依赖关系并不是一件容易的事,若漏掉或错误地确定一些函数依赖关系,则按前述方法进行关系模式规范化时,并不能得到一个在理论上被认为是好的数据库设计。

(2)即使能正确地找到所有的函数依赖关系,采用机械地分解关系模式的方法,并不考虑关系模式的具体大小以及数据的动态特征(是否经常更新),将其全部规范到同样的程度也是不合适的。

然而这并不意味着关系模式的规范化理论在实际的数据库设计中是没有意义的,它对我们进行关系数据库模式的设计仍然具有指导作用。

数据之间的函数依赖是现实世界中客观存在的,所以,函数依赖关系的确定最好是在进行系统分析、生成E-R模型的过程中完成,而不是在得到关系数据库模式后,再去寻找存在哪些函数依赖关系。实际上,在生成E-R模型时确定数据之间的函数依赖关系更为容易,因为E-R模型更接近现实世界。例如,在确定一个实体集和其相应的属性后,也就确定了属性对实体集的依赖关系,以及实体集中非关键字属性对关键字属性的依赖关系。又如,如果联系R表示从实体集E1到实体集E2的一对多联系,广义地来说,是实体集E2决定了实体集E1,在转换成关系模式后,联系R形成的关系模式的集合中有E2的关键字X和E1的关键字Y,则X→Y成立,而且X决定了R中任何一个属性集;若E1和E2之间是一对一联系,则Y→X也成立。可见,在E-R模型中隐含着许多函数依赖关系。

数据库设计一般采用先得到现实环境的E-R模型,再由E-R模型转换得到关系模式的方法。在我们进行E-R模型设计时,以及由E-R模型转换成关系模式后再进行关系模式优化设计时,关系模式规范化理论能够帮助我们得到较好的数据库设计。在设计E-R模型时,要仔细分析实体间存在的关系,这样能使我们最后从E-R模型得到的关系数据库模式基本达到3NF的规范程度。

在E-R模型中,任何事物、数据或知识都可以是实体。实体的属性是对实体某一方面特征的描述,它也有可能具有非常复杂的结构,而且属性之间也可能存在各种各样的函数依赖关系。由于我们建立E-R模型的最终目的是生成关系数据库模式,但在关系模式中是不能描述具有复杂结构的属性的,所以在发现实体某一属性结构复杂时,通常要在E-R模型中加入新的实体来解决这个问题,即将一个实体分解成多个实体,将具有复杂结构的属性处理成实体。同样,当发现某实体的属性之间除了存在对关键字属性的完全函数依赖关系以外,还有其他的函数依赖关系,或在分析插入、删除、更新等动态特性时发现有可能发生异常时,也可以通过发现新实体,将其添加到E-R模型中,从而消除这些函数依赖关系。当然,是否一定要消除这些函数依赖关系,还要综合考虑数据冗余和数据的动态特性。函数依赖多,数据冗余就多,但查询代价小。所以,对于因为保留函数依赖关系而造成数据冗余时,应当设计数据库触发器或采取别的措施来保证在插入、删除、修改时的数据一致性,避免数据操作异常的产生。

从E-R模型转换而来的关系模式一般很少含有很多的属性。因为E-R模型中的实体一般分得较细,转换得到的关系模式较小。因此,为了以后数据库查询的方便,很多情况下是要合并关系模式,而不是分解关系模式。所以,在实际应用中,要想得到一个好的数据库设计,应当根据具体情况对关系模式进行处理,既有可能要分解关系模式,也有可能要合并关系模式。

在对E-R模型转换过来的关系模式进行合并时,要避免产生多余的函数依赖关系,以免造成数据冗余。合并关键字相同的关系模式不会产生数据冗余,合并存在外关键字约束的两个关系模式时会产生数据冗余,因此是否进行合并也要全面考虑。

那么,如何将E-R模型转换为关系模式呢?

(1)E-R模型中的每个实体集都相应地转换成一个关系模式,实体集的名称就作为关系模式的名称,实体集的属性则作为关系模式的属性,实体集的关键字作为关系模式的关键字。

(2)对于E-R模型中的联系,一个联系转化成一个关系模式,联系的名称作为关系模式的名称,联系的属性作为关系模式的属性,所有参加联系的实体集的关键字也作为关系模式的属性,关系模式的关键字与联系的类型有关。

若是1:1联系,则任选一参加联系的实体集的关键字作为关系模式的关键字。

若是m:n联系,则所有参加联系的实体集的关键字作为联系所对应的关系模式的关键字。

若是1:n联系,则将多方的实体集的关键字作为关系模式的关键字。

经过上述转换而来的数据库模式一般来说不是最好的,关系模式的个数太多,过于烦琐,数据重复存储,浪费空间,且使许多查询不方便,牵涉到几个表,所以有必要将一些关系模式进行合并。我们前面讲过,可以将具有相同关键字的关系模式合并,合并后的关系模式包含合并前关系模式的所有属性。对照关系范式的要求,应使每一关系模式都满足第三范式的要求。