技术开发 频道

DB2 Viper 的新特性 XML处于核心地位

    让我们从用户的视角看看新的 DB2 XML 特性。

    逻辑存储

    XML 文档集合存储在 DB2 表中,这些表包含一个或多个新的 XML 数据类型的列。这使管理员能够使用熟悉的 SQL 数据定义语言(DDL)语句来创建存储 XML 数据的数据库对象。但是,这个熟悉的接口隐藏了一个事实:DB2 以不同的方式存储 XML 数据。它使用新技术来存储 XML 数据的层次结构,并支持高效地搜索原始 XML 数据的所有部分。

    为了用户易于集成传统形式的业务数据和 XML 数据,DB2 管理员可以创建同时包含传统 SQL 数据类型列和新的 XML 数据类型列的表。下面是这种表的一个例子:

    清单 1. 创建包含 XML 列的表

create table items ( id int primary key not null, brandname varchar(30), itemname varchar(30), sku int, srp decimal(7,2), comments xml )

    这个表的前 5 列使用传统 SQL 数据类型来保存每件商品的销售信息,包括它的 ID 号、品牌名、商品名、库存单位(SKU)和建议的零售价(SRP)。“comments” 列包含 XML 数据,这是关于此商品的顾客反馈。

    注意,在创建具有 XML 列的表时,并不指定 XML 数据的内部结构。这是故意的。XML 文档是自我描述的,它们的内部结构差异很大。DB2 对存储 XML 数据的惟一要求是它必须是 “良构的(well formed)” —— 也就是说,它必须符合 “W3C XML 标准”(参阅 “参考资料”)中指定的某些语法规则。这种宽松的方式给用户提供了很大的灵活性,更容易存储包含不同属性和内部结构的 XML 文档集合;由于业务需求或业务情况常常变化,有时候可能缺少某些信息,所以 XML 文档的属性和结构很不一致。

    但是,用户可能希望确保 XML 数据符合他们自己的结构规则,因此要求 DB2 在进行存储之前对数据进行检验。这将在 “XML 模式和检验” 一节中详细讨论。这主要涉及创建 XML 模式(也是 W3C XML 标准的一部分)并向 DB2 注册这些模式。(关于 XML 模式的更多信息,请参阅 “参考资料”。)

    现在,您可能想知道用户如何用 XML 数据填充 DB2 表。答案很简单 —— 使用两种熟悉的 DB2 机制之一。SQL INSERT 语句和 DB2 IMPORT 工具可以处理 XML 数据和其他数据类型(DB2 IMPORT 在幕后会发出 INSERT 语句)。如果您想知道 DB2 为什么只支持通过 SQL 而不是 XQuery 来插入数据,答案也很简单 —— 刚出现的 XQuery 第一版主要关注数据库读取活动,而不是写入活动。在还没有被业界明确接受的标准的情况下,IBM 提供两种用户熟悉的方法,用户可以选择其中之一来存储 XML 数据。(关于 XQuery 标准的更多信息,请参阅 “参考资料”。)

    物理存储

    在实践中,大多数用户不需要关心 DB2 对 XML 数据采用的新的物理存储管理体系结构。但是,为了帮助您了解 DB2 在幕后采用什么操作,我们简要地讨论一下 DB2 内部存储 XML 数据的方式。

    DB2 采用一种经过解析的格式来存储和操作 XML 数据,这种格式可以反映原始 XML 文档的层次结构。因此,它采用树和节点作为模型来存储和处理 XML 数据。如果用户要求 DB2 在进行存储之前针对注册的 XML 模式对 XML 数据进行检验,那么 DB2 将用模式类型信息对 XML 层次结构中的所有节点进行标注;否则,就用默认的类型信息对节点进行标注。

    对于前面给出的 “items” 表定义,我们研究一个将存储在这个表中的 XML 示例文档。如 图 2 所示,这个 XML 文档包含一个层次结构中的多个元素,包括根元素 “Comments” 以及一个或多个与给定商品相关的 “Comment” 元素。每个评论有一个相关联的评论标识符、顾客信息(可能包含用于顾客姓名和邮件地址的子元素)、顾客评论的文本以及一个标志(表示顾客是否希望接受回复)。

    图 2. 示例 XML 文档及其层次化表示 

    在存储时,DB2 会保留这个文档的内部结构,并将它的标记名和其他信息转换为整数值。这样做可以节省磁盘空间,还可以改进使用导航表达式的查询的性能。例如,在存储时,DB2 可能将 图 2 中的 “Comments” 标记转换为 “0”。但是,用户并不了解这种内部表示。

    最后,DB2 会根据需要自动地跨多个数据库页拆分文档的各个部分(即文档树的节点)。实际上,DB2 可以根据需要对文档层次结构中任何级别上的节点集合(即子树)进行拆分。在这种情况下,DB2 自动地生成和维护一个 “区域” 索引,这样就可以高效地跟踪整个文档的物理表示。

    索引

    除了提供新的 XML 层次化存储管理支持之外,DB2 还提供了新的索引技术来加快涉及 XML 数据的搜索。与关系索引相似,这些新的 XML 索引也是用熟悉的 SQL DDL 语句创建的:CREATE INDEX。但是,除了指定要建立索引的目标列之外,还要指定 “xmlpattern”(这本质上是一个没有谓词的 XPATH 表达式)来标识感兴趣的 XML 文档子集。

    例如,使用前面的 “items” 表定义和 图 2 所示的示例 XML 文档,管理员可以发出以下语句对 “comments” 列中包含的所有评论标识符(“CommentID” 值)建立索引。注意,示例文档中的 “CommentID” 元素是 “Comment” 元素的子元素,“Comment” 元素本身是根元素 “Comments” 的子元素。

    清单 2. 为 XML 列创建索引

create index myindex on items(comments) generate key using xmlpattern '/Comments/Comment/CommentID' as sql double

    有几个细节值得注意。“xmlpattern” 子句中指定的路径是大小写敏感的。因此,“/Comments/Comment/CommentID” 与 “/comments/comment/commentid” 并不对相同的 XML 元素值建立索引。另外,因为 DB2 并不要求对于一个给定的 XML 列必须有 XML 模式,所以 DB2 可能不知道什么数据类型与指定的模式相关联。用户必须使用支持的 SQL 类型之一(VARCHAR、VARCHAR HASHED、DOUBLE、DATE 和 TIMESTAMP)显式地指定数据类型。

    最后,尽管使用 SQL DDL 语句来创建 XML 索引,但是 XML 数据上的索引与传统 SQL 数据类型列上的索引是不一样的。DB2 XML 索引技术的细节超出了本文的范围,但是应该注意两个显著的差异:

    XML 数据上的索引通常只涉及文档(列)内容的一个子集。与此相反,传统 SQL 数据上的索引总是涉及整个列的内容。
表中的一行可能会产生多个 XML 索引项,因为一个 XML 文档可能包含零个、一个或许多个与指定的 xmlpattern 匹配的 “节点”。与此相反,非 XML 索引对于表中的每一行只包含一项。
对于某些应用程序,全文搜索是很重要的。IBM 扩展了 DB2 的文本搜索功能,使其能够搜索 XML 列中存储的数据。对 CREATE INDEX 语句的扩展使管理员能够创建全文索引,从而帮助改进这种搜索的性能。

0
相关文章