1
数据库原理与应用技术
1.5.5.2 4.5.2 关系模式的优化
4.5.2 关系模式的优化

关系数据库模式由一组关系模式组成。为了更好地支持应用,需要对关系模式进行优化。优化的目标包括以下几方面。

(1) 消除各种数据库操作异常。

(2) 查询更快和更方便。

(3) 节省存储空间。

(4) 方便数据库的管理。

常见的优化手段包括规范化、逆规范化、水平分割和垂直分割等。其中,规范化可以有效地消除各种操纵异常,其方法已在第3章介绍。下面介绍后3种手段。

1. 逆规范化

规范化通过模式分解而将一个低范式转化成两个或多个高范式。而逆规范化的过程相反,它将两个或多个高范式通过自然连接,重新组合成一个较低的范式。

规范化和逆规范化是一对矛盾。何时进行(逆)规范化?进行到何种程度?需要设计者仔细分析和平衡。

2. 水平分割

水平分割是指按一定原则,将一个表从横向分割成两个或多个表的方法,如图4-26所示。

图4-26 水平分割

若R1∩R2=ø(空),则这个分割称为正交(Orthogonal)分割。

表的大小对查询的速度影响颇大。有时为了提高查询速度,可将一个大表水平分割成多个小表。下面举例说明。

在一个图书馆系统中,为便于管理,常按一定主题将书进行分类。不同类的图书存储在不同的书库中,并单独提供对外服务。假设所有图书分为社会科学和自然科学两大类,分别由两个部门保管和对外提供服务。此时,对于社会科学部的管理人员而言,他们只关心社会科学类图书。为此我们可考虑将“图书目录”表水平分割成两部分,一个表为“社科图书目录”,另一个表为“自然科学图书目录”,这将方便各部门(自己所管理的图书)对信息的处理。

水平分割后,将给一些全局性应用带来不便,这里同样需要设计者仔细权衡。

1)满足“80/20原则”的应用

80/20原则:一个大关系中,经常使用的数据只是关系的一部分,把约20%经常使用的数据分解出来,形成一个子关系,可以减少查询的数据量。

2)并发事务经常存取不相交的数据

如果关系R上有n个事务,而且多数事务存取的数据不相交,则R可分解为不大于n个子关系,使每个事务存取的数据对应一个关系。

3. 垂直分割

垂直分割就是通过模式分解,将一个表纵向分割成两个或多个表的方法。进行垂直分割有两个原因。第一个原因是为了进行关系模式规范化,将低范式分解成高范式(如BCNF);第二个原因是在有些场合,一个关系模式已达到很高范式,仍要对其进行垂直分割,此时的目的已不是为了规范化,下面以一个例子进行说明。

职工(职工号,姓名,性别,电话,…)∈BCNF

↓垂直分割

职工(职工号,姓名,性别,…)∈BCNF

职工电话簿(职工号,姓名,电话)∈BCNF

从职工中分割出职工电话簿,目的是支持公众的应用,以使“查询电话号”这项应用效率更高,同时又不涉及原职工表中的保密属性。此例中,职工电话簿既可单独建表,也可以在原职工表上建立视图。两种方式各有利弊,读者可自行分析。

需要注意的是,并不是规范化程度越高的关系就越优,较高的规范化会加重查询的负担,导致查询速度慢。因此,对于一个具体应用,具体规范到哪种范式,需要权衡响应时间和潜在问题的利弊再做决定。