1、第 4 章 逻辑数据库设计数据 库实施共分为 5 个阶段:需求分析、逻辑设计、实现设计、物理设计以及实施与维护。数据库的逻辑设计是对需求说明书提供的应用需求(数据及其处理)进行抽象与综合处理,并按特定的方法设定满足该需求的概念模型。本章主要介绍 DB2 的逻辑数据库设计。本章主要内容包括: 数据库中需要记录哪些信息 数据库关系 列定义 主键 标识列 规范化 多维聚集 选择 MDC 表维需要考虑的事项 创建 MDC 表需要考虑的事项 约束 触发器 其他数据库设计需要考虑的问题4.1 数据库中需要记录哪些信息数据库设计首先标识要存储在数据库表中的数据类型。一个数据库包括有关一个企业或组织及其相互关
2、系的信息。在关系数据库中,把实体表示为表。一个实体就是用户用来存储信息的人、对象或概念。实例表中描述的一些实体可能就是学生、课程和教师。例如,在 DB2 实例数据库的学生表中记录了实体“学生”所具有的属性或特性,如学生学号、姓名、课程和成绩。这些特性显示为STUNO、FIRSTNAME、LASTNAME、COURSE 和 SCORE 列。实体“学生”的具体值由一个学生的所有列中的值组成,每个学生有一个唯一的学生学号(STUNO) ,该号码可用来标识实体“学生”的具体值。一个表中的每一行表示一个实体或关系的一个具体值。例如,在表 4-1 中,第 1 行中的值为姓 Chen 的学生。表 4-1 “
3、学生”实体及其属性的具体值STUNO FIRSTNAME LASTNAME COURSE SCORE000010 K. J. Chen English 88.0000020 G. Yu French 90.5000121 K. L. Wang Computer 65.5000140 L. M. Guo Chemistry 78.0000210 A. W. Li Math 98.0000220 G. Li Physics 87.0000340 M. L. Zhang Math 91.0000350 P. Zhang Computer 95.0000410 M. Wu English 66.0另外
4、在一个表中,某一行的每一列都以某种方式与该行的所有其他列相关。实例表中表达的一些关系如下。 学生选修课程:Chen K. J.选修课程 English。 学生得到一份成绩:Chen K. J.得了 88.0 分。 课程与课程有先后顺序 学生辅导课程:Li A.W.辅导 Math 课程。学生和课程都是实体;Li A.W.是学生的一个具体值的一部分,而 English 是课程的一个具体值的一部分。相同的关系应用于一个表的每一行中的相同列。例如,一个表的某行表示的关系是 Li A.W.选修 Math 课程。4.2 数据库关系了解实体表需要记录哪些数据之后,就要定义数据库中这些实体表间的关系。大致可分
5、为几种类型的数据库关系。例如,考虑学生与课程之间的可能关系,一个学生可以选修多门课程。对于学生,此关系是多值的。另一方面,一个课程可有许多学生,对于课程,此关系也是多值的。学生(多值的)和课程(多值的)之间的关系是多对多的关系。本节讨论下列类型的关系。4.2.1 一对多和多对一关系要为每个一对多和每个多对一的关系定义表。(1) 把关系的“多”方是相同实体的所有关系分组。(2) 为改组中的所有关系定义单个表。在表 4-2 中,第 1 个关系和第 2 个关系的“多”方是学生,因此定义一个学生表STUDENT,如表 4-3 所示。表 4-2 多对一关系实体 关系 实体学生 修 系学生 得到 分数系
6、报告给 (管理)部门在第 3 个关系中,部门是“多”方,因此定义一个部门表 DEPARTMENT,如表 4-4所示。表 4-3 STUDENTSTUNO DEPT SCORE000010 A00 88.0000020 B01 78.0000120 A00 81.5000140 C01 95.0000210 C01 89.0000150 C01 92.5000340 D11 91.0表 4-4 DEPARTMENTDEPTNOADMRDEPTC01 A00D01 A00D11 D014.2.2 多对多关系两个方向都是多值的关系是多对多关系。一个学生可以修多门课程,而一门课程可以有多个学生。查询“
7、Carl 在做什么?”和“谁选修了课程 Math?”都得到多个答案。在一个表中,对每个实体(学生或课程)使用一列,可以表示多对多关系,如表 4-5 所示。表 4-5 学生活动(STU_ACT)STUNOCOURSE000035 English000035 Math000065 Math000120 Computer000250 English4.2.3 一对一关系一对一关系在两个方向都是异值的。一个部长管理一个部门,一个部门只有一个部长。查询“谁是部门 C01 的部长? ”和“Carl 管理哪个部门?”都只有一个答案。可将该关系指定给 DEPARTMENT 表或 EMPLOYEE 表。因为所有
8、部门都有部长,但不是所有学生都是部长,因此将部长添加至 DEPARTMENT 表是最合乎逻辑的,如表 4-6 所示,显示了一对一关系。表 4-6 DEPARTMENTDEPTNOMGRNOA00 000010B01 000035D11 0000654.2.4 保证相等值表示相同的实体可以有多个表描述相同相同的实体集合。例如,EMPLOYEE 表显示分配的雇员所在的部门的号码,而 DEPARTMENT 表显示每个部门分配哪个经理。要同时再次获取属性集合,就可以把这两个表按照匹配的列联合起来,如下例表 4-7 和表 4-8 所示。WORKDEPT和 DEPTNO 的值表示相同的实体,并且表示 DE
9、PARTMENT 和 EMPLOYEE 表的联合路径。表 4-7 DEPARTMENT 表DEPTNO DEPTNAME MGRNO ADMRDEPTD21 Administration Support000070 D01表 4-8 EMPLOYEE 表EMPNO FIRSTNAME LASTNAME WORKDEPT JOB000250 Daniel Smith D21 Clerk当从多个表中再次获取有关实体的信息时,就要确保相等的值表示相同的实体。连接列有不同的名称 (如前面实例的 WORKDEPT 和 DEPTNO),或者有相同的名称 (如部门和项目表中的名为 DEPTNO 的列) 。4
10、.3 列定义在确定了实体表的数据和不同实体表的关系之后,就要确定数据库的所有表由哪些列组成。完成下列工作,来定义的表的列,如图 4-1 所示。图 4-1 表的列 选择一个列名称。一个表的每一列都必须具有在该表中唯一确定的名称。 选择有效的列的数据类型。可以从数据库管理程序所提供的类型集合中选择数据类型,也可以选择自行创建自定义的类型。 说明哪些列可能需要默认值。某些列可能需要一些默认值,另外对一些表来说,可能一些行的值没有意义,这是由于: 列值不适用于该行。例如,包含雇员中间姓名首字母的一列不适用于没有中间名首字母的雇员。 值适用,但还不知道其值。例如,MGRNO 列可能包含无效的经理号,因为
11、该部门的上一个经理已调离,而新经理尚未任命。在这两种情况下,可以选择允许空值,即表示列值是未知的或不适用的特殊值,也允许数据库管理程序或应用程序指定非空的默认值。4.4 主键定义了表的列之后,有时还要设置表的关键字或索引,这会有助于数据库设计的规范化以及数据库使用性能的提高。关键字就是一组可用来标识或存取特定行的列。在表、索引和参考约束的说明中标识关键字。同一列可以是多个关键字的一部分。唯一关键字是用来约束任何两个值不能相等的关键字。唯一关键字的列不能包含空值。例如,可将雇员号码列定义为唯一关键字,因为该列中的每个值只标识唯一的一个雇员,一个雇员号码不可能表示两个雇员。用来强调关键字唯一性的机
12、制就称为唯一索引。一个表的唯一索引是一列或若干列的有序集合,而每个值标识这些列的唯一行。唯一索引可以包含空值。主关键字是在表定义的唯一关键字中的一个,而且该关键字被选为最重要的关键字。一个表中只能有一个主关键字,如图 4-2 所示。图 4-2 定义表的主关键字DB2 会自动为主关键字创建主索引。数据库管理程序使用主索引来有效地存取表的行。而且主索引允许数据库管理程序实现主关键字的唯一性。也可以在非关键字的列上定义索引,以便于处理查询时高效存取数据。若一个表没有“自然”的唯一关键字,或者入表顺序是用于区分唯一行的方法,就使用时间日戳作为关键字的一部分。表 4-9 显示项目表的一部分,包括其主关键
13、字列。表 4-9 项目表上的主关键字PROJNO(主关键字) PROJNAME DEPTNOMA2100 WWW Automation D01MA2110 MMM Programming D11若一个表中的每一列都包含重复的值,则不能只用一列来定义主关键字。具有多列的关键字是组合关键字。列值的组合应定义唯一的一个实体。若定义组合关键字不太容易,就可考虑创建具有唯一值的新列。表 4-10 表示包含多列的一个主关键字(组合关键字) 。表 4-10 EMP_ACT 表上的组合主关键字EMPNO(主关键字)PROJNO(主关键字)ACTNO(主关键字)EMPTIME EMSTDATE(主关键字)000
14、230 AD4122 70 1.0 1988-01-02000230 AD4122 70 0.5 1991-04-04000230 AD4122 80 0.8 1991-04-04要标识入选关键字,选择定义唯一实体的最少数目的列。可能有多个入选关键字。在表 4-8 中,有多个入选关键字。 EMPNO、WORKDEPT 和 JOB 这 3 列都唯一地标识该雇员。从一组入选关键字中选择一个主关键字的标准应是持久性、唯一性和稳定性。 持久性表示总是存在每一行的主关键字值。 唯一性表示每一行的关键字值与所有其他行不同。 稳定性表示主关键字值始终不变。在该示例的 3 个入选关键字中,只有 EMPNO 全
15、部满足这些标准。一个雇员在进入一家公司后,工作部门可能改变,工作也可能改变,尽管它们在某个时候可能是唯一的,但不能保证始终如此。雇员号码列是主关键字的最佳选择,一个雇员只被赋予一次一个唯一的号码,而且只要该雇员在该公司内任职,通常不会更新该号码,因此雇员号码列中的值是持久的。4.5 标识列标识列向 DB2 提供了一种为一个表中的每一行自动生成唯一数值的方法。一个表只能有一个定义了标识属性的列。标识列的示例包括订单号码、雇员号码、证券号码和事故号码。标识列的值可以始终生成或在默认情况下生成。 DB2 保证定义为始终生成的标识列是唯一的。它的值总是由 DB2 生成,不允许应用程序提供显式的值。 定
16、义为在默认情况下生成的标识列向应用程序提供了显式地为标识列提供一个值的方法。若未给出任何值,则 DB2 生成一个值,但在此情况下,不能保证该值的唯一性。DB2 只对它生成的那些值保证唯一性。标识列特别适合于生成唯一主关键字值这一任务,如图 4-3 所示。应用程序可使用标识列,来避免应用程序在数据库外部生成其自己的唯一计数器时可能引起的并行和性能问题。例如,实现应用程序的一种常见方法就是维护只有一行的表,它包含一个计数器。每个事务都锁定这个表,增加其值,再执行,所以每次只有一个事务可以增大其计数器的值。相反,若通过标识列维护该计数器,由于事务不锁定该计数器,所以可以获取更高级别的并行性。一个未实
17、现的已经增加该计数器的事务不会阻止后续事务增大该计数器。图 4-3 生成表的唯一关键字标识列的计数器的改变(增大或减小)独立于事务。若给定的事务两次增大该标识计数器,则该事务可能会在生成的数字之间看到一个间隙,因为当前可能有其他事务正在增大同一个计数器的值,并把其值插入同一个表中。若一个应用程序的数字范围必须要连续,则该应用程序应对带有标识列的表进行互斥锁定。因为会造成并行性的丢失,因此必须对此决定以供权衡。此外,有可能由于生成标识列的值的事务已经回滚,或者由于存放值序列的数据库在指定所有存放的值之前被停用,从而引起给定的标识列的数字间隙。标识列生成的序号有如下附加特性: 值可以为任何小数位是
18、 0 的精确数字数据类型,即小数位为 0 的SMALLINT、INTEGER、BIGINT 或 DECIMAL(单精度和双精度浮点类型被认为是适当的数字数据类型) 。 连续值之间可以有任何指定的整数增量,默认增量为 1。 标识列的计数器可以恢复。如果计数器发生故障,就可以从日志中重新构造计数器的值,因此可以保证继续生成唯一的值。 可以将标识列的值存入高速缓存中,以获取更好的性能。4.6 规范化规范化有助于消除表中数据的冗余和不一致性。规范化是将表精简为一组列的过程,对于这组列,所有的非关键字列都依赖于主关键字列。否则,在更新时,该数据可能变得不一致。规范化就是对设计采用一些特殊规则,避免数据的
19、不一致性和冗余。用 SQL 来处理数据。规范化是必需的,如果设计不好,就很难使用 SQL 来操作数据。为了充分发挥 SQL的作用,往往是转化到第三范式。规范化的一个简单原则就是:所有的属性必须完全依赖于键。如果一个设计不符合第三范式,则会引起更新异常(因为相同的数据在多个地方出现) ,这些异常可用程序来处理。这导致了比较差劲的设计,很难保证数据的一致性。本节简要说明第一范式、第二范式、第三范式和第四范式形式的规则。由于大家一般比较熟悉表的第 5 范式,这里就不多说了。 第一范式:表中的每一行和每一列均有一个值,并且永远不会是一组值。 第二范式:每个不是关键字一部分的列都依赖于关键字。 第三范式
20、:每个非关键字列都独立于其他非关键字列,并依赖于关键字。 第四范式:没有行包含有关一个实体的两个或更多独立的多值事实。下面给出五个范式解决的设计问题: 第一范式:删除重复组。 第二范式:删除部分依赖复合键的属性。 第三范式:保证非键属性在功能上不依赖于其他非键属性。 第四范式:删除非依赖的多值数据。 第五范式:删除相交依赖属性。4.6.1 第一范式使用第一范式形式的表不必满足更高的规范形式的标准。例如,表 4-11 违反了第一范式形式,因为对于 PART 的每个具体值,WAREHOUSE列都给出了几个值。表 4-11 违反第一范式的表PART(主关键字) WAREHOUSEP0010 Ware
21、house A, Warehouse B, Warehouse CP0020 Warehouse B, Warehouse D表 4-12 是显示使用第一范式形式的同一个表。表 4-12 符合第二范式形式的表PART(主关键字) WAREHOUSE(主关键字) QUANTITYP0010 Warehouse A 400P0010 Warehouse B 543P0010 Warehouse C 329P0020 Warehouse B 200P0020 Warehouse D 2784.6.2 第二范式当一个非关键字列依赖于组合关键字的一部分时,违反了第二范式形式,如表 4-13 所示。表 4
22、-13 违反第二范式形式的表PART(主关键字)WAREHOUSE(主关键字)QUANTITY WAREHOUSE_ADDRESSP0010 Warehouse A 400 1608 New Field RoadP0010 Warehouse B 543 4141 Greenway DriveP0010 Warehouse C 329 171 Pine LaneP0020 Warehouse B 200 4141 Greenway DriveP0020 Warehouse D 278 800 Massey Street该表的主关键字是一个组合关键字,它由 PART 和 WAREHOUSE 列组
23、成。因为WAREHOUSE_ADDRESS 列只依赖于 WAREHOUSE 的值,因此该表违反了第 2 种规范形式的规则。此设计存在下列问题。 对于该仓库中存储的一个部件,在每个记录中重复了该仓库地址。 若一个仓库的地址变更,则必须更新引用存储在该仓库中的一个部件的每一行。 由于存在这种冗余,该数据可能变得不一致,表现为不同的记录对相同的仓库显示不同的地址。 若某个时候一个仓库中没有存储部件,就可能没有一行记录了该仓库地址。解决方案是将该表分割成表 4-14 和表 4-15 所示的两个表。表 4-14 符合第二范式形式的 PART_STOCK 表PART(主关键字) WAREHOUSE(主关键
24、字) QUANTITYP0010 Warehouse A 400P0010 Warehouse B 543P0010 Warehouse C 329P0020 Warehouse B 200P0020 Warehouse D 278表 4-15 符合第二范式形式的 WAREHOUSE 表WAREHOUSE(主关键字) WAREHOUSE_ADDRESSWarehouse A 1608 New Field RoadWarehouse B 4141 Greenway DriveWarehouse C 171 Pine LaneWarehouse D 800 Massey Street若有两个表使用
25、第二范式形式,就需要考虑性能。根据部件位置生成报告的应用程序必须将这两个表连接起来以检索相关信息。4.6.3 第三范式关系规范化设计有五级,这五级一起叫范式。把一个设计转化为第三范式就是很好的关系设计。第三范式对大多数关系数据库设计来说已经是最优设计,因为它消除了会引起更新异常的数据冗余。还有改进的第三范式 BCNF(Boyce-Codd normal form) ,它需要每个字段为候选键。然而,在某些情况下,可能要转化到第四范式或第五范式,用来处理多值依赖和连接依赖。表 4-16 中包含 EMPNO 列和 WORKDEPT 列。假定添加了 DEPTNAME 列,这个新列依赖于 WORKDEP
26、T,但主关键字是 EMPNO。该表现在违反了第 3 种规范形式,更改雇员 Carl White 的 DEPTNAME 将不会更改该部门中其他雇员的部门名。现在部门号 E11 中有两个不同的部门名。产生的不一致显示在该表的更新版本中,如表 4-16 所示。表 4-16 更新前的不规范 EMPLOYEE_DEPARTMENT 表EMPNO(主关键字)FIRSTNAME LASTNAME WORKDEPT DEPTNAME000290 Carl White E11 Operations000320 Ramlal Setright E21 Software Support000310 Maude Pa
27、rker E11 Operations表 4-17 更新后的不规范 EMPLOYEE_DEPARTMENT 表EMPNO(主关键字) FIRSTNAME LASTNAME WORKDEPT DEPTNAME000290 Carl White E11 Installation Mgmt000320 Ramlal Setright E21 Software Support000310 Maude Parker E11 Operations可创建一个含有 WORKDEPT 列和 DEPTNAME 列的新表,将该表规范化。诸如更改部门名之类的更新现在更加简单,只需要更新这个新表。返回部门名和雇员名的
28、SQL 查询编写起来更复杂,因为它需要连接两个表。它运行的时间可能比对单个表查询的时间长。因为 WORKDEPT 列必须出现在两个表中,所以需要附加存储空间。表 4-18 和表 4-19 显示规范化的结果。表 4-18 将 EMPLOYEE_DEPARTMENT 表规范化之后的 EMPLOYEE 表EMPNO(主关键字) FIRSTNAME LASTNAME WORKDEPT000290 Carl White E11000320 Ramlal Setright E21000310 Maude Parker E11表 4-19 将 EMPLOYEE_DEPARTMENT 表规范化之后的 DEPA
29、RTMENT 表DEPTNO(主关键字) DEPTNAMEE11 OperationsE21 Software Support4.6.4 第四范式考虑下列实体:雇员、技能和语言。一个雇员可有几种技能,并通晓几种语言。有两种关系,一种关系是雇员和技能之间的关系,另一种关系是雇员和语言之间的关系。若一个表表示了这两种关系,则它未使用第四范式形式,如表 4-20 所示。表 4-20 违反第四范式形式的表EMPNO(主关键字) SKILL(主关键字) LANGUAGE(主关键字)000130 Data Modelling English000130 Database Design English000
30、130 Application Design English000130 Data Modelling Spanish000130 Database Design Spanish000130 Application Design Spanish应改用两个表表示这种关系,如表 4-21 和表 4-22 所示。表 4-21 符合第四范式形式的 EMPLOYEE_SKILL 表EMPNO(主关键字) SKILL(主关键字)000130 Data Modelling000130 Database Design000130 Application Design表 4-22 符合第四范式形式的 EMPLO
31、YEE_LANGUAGE 表EMPNO(主关键字) LANGUAGE(主关键字)000130 English000130 Spanish若这些属性是独立的(即雇员只将特定的语言应用于特定的技能) ,则不应将该表分割。设计数据库的一个良好策略是将所有数据安排在使用第四范式形式的表中,然后决定该结果是否提供了一个可接受的性能级别。如果没有,则可将数据重新安排在使用第三范式形式的表中,然后重新评价性能。4.7 多维聚集多维聚集(Multidimensional clustering,MDC)提供了一种按照多维度对数据灵活、连续、自动聚集的高级方法。这种方法可以促进查询性能的提高,减少数据维护操作如再
32、组织和插入、更新以及删除时的索引维护操作。多维聚集主要用于数据仓库和大型数据库环境,也可以用于在线事务处理环境(online transaction processing ,OLTP) 。多维聚集可以使得一个表按照多个键同时物理聚集。在 DB2 8 版本之前,DB2 仅仅支持通过聚集索引的数据一维聚集。使用一个聚集索引,DB2 试图按照索引的键顺序维护页面上数据的物理次序,就如在表中插入和更新记录一样。聚集索引大大改进了预测包含键的聚集索引的查询性能,使用聚集,就只有部分表需要访问。如果页面有序,就可以更高效地执行聚集。使用多维聚集(MDC)这些好处可以扩展到多个维度,或者多个聚集键。在查询性
33、能方面,涉及任何指定的表或者表的组合的查询可以从聚集中获利。不仅这些查询只访问那些有正确的维值的记录,这些查询页面将适当地组合起来。而且,尽管有聚集索引的表当表中空间已填充时可以变得非聚集化,一个多维聚集(MDC)表能够自动连续地维护所有的维度,这样就没有必要再次组织表以恢复数据的物理次序。创建表时,可以制定一个或多个键,作为聚集数据的维度。这些维度中的任何一个都可以由一个或多个列组成,就像索引键一样。一个维度块索引就自动作为指定的维度之一被创建,并且用于优化器对每个维度快速高效的数据访问。一个合成块索引也自动创建,包含所有的维度键列,并将用于维护插入和更新活动中数据的聚集。如果单个维度还没有
34、包含所有的维度键列,就仅仅创建合成块索引。合成块索引也可以用来优化器高效访问具有特定维度值的数据。在一个多维聚集(MDC)表中,每个唯一维度的组合取值于逻辑单元,逻辑单元在物理上由页面的块组成,一块就是磁盘上连续页面的集合。包含维度键值的数据页面的块的集合称为片(slice) 。表的每一页都是一个块的一部分,表的所有块由相同数字的页面组成。块因素就等价于大小,这样块的边界可以用某些边界线划分。考虑记录国家销售员的销售数据的多维聚集(MDC)表。这个表按照维度“年和月”和“地区”聚集。表中的数据存储在块中,块包含了磁盘上连续页面的一定价值。如图 4-4 所示,一个块用长方形表示,并且按照表中分配
35、数据的逻辑次序编号。图表中的网格表示这些块的逻辑分区,每个正方形表示一个逻辑单元。网格中的一列或一行表示特定维度的片。例如,所有在地区列含有“中南”值的记录都可以在网格的“中南”列定义的片中的块里面找到。事实上,片中每个块都包含地区域的值为“中南”的记录。这样,当且仅当一个块包含地区域的值为“中南”的记录时,它才被包含于片或者网格的列中。图 4-4 具有地区与年和月维度的多维表为了更易于决定哪些块组成一个片,或者哪些块包含所有含有特定维键值的记录,就在建表时自动为每个维度创建了维度块。在图 4-5 中,在“年和月”维度上创建了一个维度块索引,而在地区维度上创建了另一个维度块索引。每个维度块索引
36、按照和传统的 RID 索引的方式结构化,除了在叶子级别上以块标识器(BID)的键指针代替了记录标识器。由于每个块包含许多页记录,这些块索引比 RID 索引小得多,并且仅仅需要在需要新的块时更新这些块索引,然后添加到一个单元中。一片或者包含具有特定维度值的所有记录的页面的块集合,将在相关维度块索引中表示为一个键值的 BID 列表。图 4-5 显示维块索引的具有地区与年和月维度的多维表图 4-6 描述了从地区维度块索引上的键如何显示。这个键由一个名为“中南”的键值和一组 BID。每个 BID 包含一个块位置。在图 4-6 中列出的块号码和“中南”片中的一样。图 4-6 地区上的维度块索引的键类似地
37、,要找到一组包含“年和月”维度值为“9902”的所有记录的块的列表,就要在图 4-7 中“年和月”维度块索引中查找这个值。图 4-7 年和月上的维度块索引的键当一条记录插入到销售表中时,DB2 就决定一个单元是否存在维度值。如果存在,DB2 就把这条记录插入到那个可行的单元的块中,否则如果现有的块满了就要插入到那个单元的另一个块中。如果这个单元也不存在,DB2 就会创建一个新的单元,并把一个块添加到其中。自动维护通过附加的块索引执行,也可以在建 MDC 表时创建。这个块索引将位于这个表的所有维度列上,这样每个键值对应于表中特定单元,而 BID 列表对应于组成这个单元的块列表,如图 4-8 所示
38、。索引的类型就是一个合成块索引。在这个合成块索引中一个键仅用于包含记录的表的每个单元。这个块索引支持快速、高效地查找那些具有维度值的特定集合的记录的块。合成块索引用于查询处理,来访问具有特定维度值的表中的数据。它也用于按照插入活动过程中的表维度动态管理和维护数据聚集。图 4-8 年和月、地区上的组成块索引例如,如果要查找具有“西北”地区值和“9903”年和月值的销售表中的记录,DB2就会在合成块索引上查找键值 9903、西北,如图 4-9 所示。这个键由名为“9903,西北”的键值和一组 BID 组成。可以看到 BID 只列出了 3 和 10,而且在这个销售表中包含这两个特定值的块只有两个。图
39、 4-9 年和月、地区上的组成块索引的键要图例说明插入时索引的用法,就可以举插入维度值为 9903 和西北的另一条记录的例子。DB2 会在合成块索引中查找这个键值,并找到块 3 和块 10 作为 BID。这些块包含了所有具有这些维度键值的记录。如果这些页面中还有空间的话,DB2 故而在这些块中的一个插入新的记录。如果在这些块的任何页面都没有空间了,DB2 就为这个表分配新的块,或者使用表中以前空闲的块。注意在这个例子中,块 48 在这个表中还没有使用。DB2 就在这个块的页面中插入记录,并通过添加它的 BID 到合成块索引和每个维度块索引把这个块分配给这个单元。图 4-10 给出了添加块 48
40、 之后维度块索引的键的图例。图 4-10 加入块 48 之后维块索引的键如果这个销售表是在三个维度上聚集,单个维度块索引就也能用于查找包含满足查询所有维度表的子集的块集合。如果这个表具有年和月、地区和产品三个维度,这就可以认为是一个逻辑立方体,如图 4-11 所示。图 4-11 具有年和月、地区与产品维的多维表四个块索引将被创建于具有三维度的多维聚集(MDC)表上:每个单维度(“年和月”、地区与产品)给一个块索引,另一个块索引作为键。如果要查找所有产品产品 A、地区东北的记录,DB2 就会首先决定包含产品产品 A 的所有块的片,这就要在产品维度块索引中查找产品 A 键,如图 4-12 所示。然
41、后 DB2 就决定包含所有地区东北的记录的块,这就要在地区维度块索引中查找“东北”键,如图 4-13 所示。图 4-12 产品上的维块索引的键图 4-13 地区上的维块索引的键要查找包含所有具有这两个值的记录的块的集合,就得查找这两个片的交集。可以通过索引与操作这两个 BID 列表完成操作。共同的 BID 值为 11、20、26、45、54、51、53和 56。一旦有了要扫描的块的列表,DB2 能为每个块做最小关系的扫描。这就只涉及每块的 I/O,因为每个块就存为磁盘上的限度,并能作为一个单元读到缓冲池中。DB2 仅仅需要在块的一个记录上再次应用预测,因为块中的每个记录都确保具有相同的维度键值
42、。如果存在其它预测,DB2 只需要在块中这些余下的记录中进行检查。常规基于 RID 的索引也在多维聚集( MDC)表中得到了支持,而且块索引可以由索引与操作和或操作组合而成。这个索引建议器有助于在多维聚集(MDC)表中选择基于 RID的索引。否则多维聚集(MDC)表就会看做任何存在的表,也就是说可以在此基础上定义触发器、引用集成、视图、实体化查询表。 多维聚集(MDC )和数据库分区 : 多维聚集可以用于连接数据库分区。事实上,多维聚集(MDC)可以执行数据库分区。例如,多维聚集(MDC)销售表聚集在维度“年和月” 、 “地区”和“产品”之上。这个表也可以数据库在地区域上的分区(或其它域)来分
43、区。在地区分区的情况下,所有特定地区的块都会在相同的数据库分区中找到,但是那个分区可以包含多个地区值。每个分区将包含一个多维聚集(MDC)表,这个表具有对应于分区地区分区值的逻辑立方体。例如,中南和西北片可以在一个分区中找到,然而西南和东北也可以在另一个分区中找到。每个分区也将包含块索引,这些块索引具有包含于分区中的块值。 多维聚集(MDC )表的负载考虑: 如果在常规基础上卷动数据到数据仓库之中,就可以使用多维聚集(MDC)表。在多维聚集(MDC)表中,在扩展表并添加剩余数据的新块之前首先将要重复使用以前空的块。删除数据集之后,例如一个月的旧数据财富,就使用负载工具,来卷入下个月的数据,并且
44、它可以重新使用删除之后清空的块。 多维聚集(MDC )表的日志考虑: 在以前列或者由 RID 索引引导的情况下使用块索引引导,这样就可以减少索引维护和日志过程。只有当在整个块中的最后一条记录被删除时,DB2 才需要从块索引中删除这个 BID,并把这个索引操作记入日志中。类似地,只有当一个记录插入到一个新的块中(如果它是一个单元的第一条记录或者是对当前满块单元的插入) ,DB2 才需要在块索引中插入一个BID,并把那个操作记入日志中。因为块可能界于 2 和 256 页记录之间,这个块索引维护和日志过程将相对小一些。对表和 RID 索引的插入和删除仍然将被日志下来。 MDC 表的块索引考虑: 当为
45、一个多维聚集(MDC)表定义一个维度时,就要创建一个维度块索引。而且,一个合成块索引就为已定义的所有维度创建了。如果已为多维聚集(MDC)表定义了仅仅一个维度,DB2 就会只创建一个块索引,这既可作为维度块索引,又可作为合成块索引。类似地,如果在列 A(或多列:列A、列 B)上创建了一个多维聚集(MDC)表的维度,DB2 就会在列 A 和列 A 与列 B 的维度块索引上创建一个维度块索引。因为一个合成块索引是表中所有维度的块索引,列 A 和列 B 上的维度块索引也将作为合成块索引。合成块索引也用于查询处理,访问具有特殊维度值的数据。注意合成块索引中键部分的次序可能影响查询处理的用法和适用性。其
46、键部分的次序由创建多维聚集(MDC)表时使用的整个 ORGANIZE BY DIMENSIONS 子句的列次序决定。例如,如果使用语句CREATE TABLE t1(c1int, c2 int, c3 int, c4 int) ORGANIZE BY DIMENSIONS (c1, c4, (c3,c1), c2)创建一个表,那么就会在列 (c1,c4,c3,c2) 上创建复合块索引。注意尽管 c1 在维度子句中指定了两次,但它作为复合块索引的键部分只用了一次。复合块索引的键部分的次序不会对插入处理造成任何影响,但可能对查询处理产生影响。所以,如果更值得具有列序为 (c1,c2,c3,c4)
47、的复合块索引,那么就应该使用 CREATE TABLE t1(c1int, c2 int, c3 int, c4 int) ORGANIZE BY DIMENSIONS (c1, c2, (c3,c1), c4) 语句创建这个表。4.8 选择 MDC 表维需要考虑的事项可以从多维聚集(MDC)获利的查询有: 当选择表的维度时首先要考虑哪些查询可以从块级聚集获利。这将要考虑创建涉及平等性和查询范围的列的维度键,特别是那些维度值比较大的列。也要考虑在涉及有维度表的启动节点的多维聚集(MDC)事实表中创建外部键的维度。应该牢记在多个维度上自动连续聚集和适度或块级聚集的性能优点。 能利用多维聚集的查询
48、包括下列形式的查询。对于所有的这些例子,其前提是有一个具有维度 c1、c2 和 c3 的多维聚集( MDC)表。例 1.SELECT FROM t1WHERE c3 100 AND c1 = 16/03/1999 AND c3 1000 and c3 5000这个查询指使用 AND 操作进行 c2 和 c3 上的范围预测以及 c1 上的等价预测。这可以在内部复写,来访问每个维度块索引上的表。C2 块索引的扫描将用来查找键值大于 100 的 BID,一个 c3 块索引上的扫描将用来查找键值界于 1000 和 5000 之间的BID,而一个 c1 块索引上的扫描将用来查找键值为“15/02/200
49、3”的 BID。然后对每个块扫描的 BID 结果进行索引与操作,来查找它们的交集,再对块的结果集合应用最小相关扫描,来找到实际的记录。例 4.SELECT FROM t1WHERE c1 5000 OR c2 IN (1,2,3)这个查询指 c1 维度上的范围预测和 c2 维度上的 IN 预测以及或(OR)操作。这可以在内部复写,来访问维度块索引 c1 和 c2 上的表。一个对 c1 维度块索引的扫描将用来查找小于 5000 的值,而另一个对 c2 维度块索引的扫描将用来查找值 1、2 和 3。索引或操作将用来对每个块索引扫描的结果 BID 进行操作,然后对块的结果集合应用最小相关扫描,来查找实际的记录。例 5.SELECT FROM t1WHERE c1= 15 AND c4 12这个查询值对 c1 维度的相等性预测和对一个列而不是维度的另一个范围预测,以及与(AND)操作。这可以在内部复写,来访问 c1 上的维度块索引,从而从 c1 值为15 的表的片中得到块的列表。如果在 c4 上有一个 RID 索引,一个索引扫描就要用来再次获取 c4 值小于 12 的 RID,然后对块的结果列表和记录的列表进行与操作。这个交集会清除 c1 为 15 的块没有找到的 RID,只有在这