技术开发 频道

DB2 Viper对XML数据支持的新特性

    管理新的数据形式常常要面对新的挑战。许多 IT 领导者发现 Extensible Markup Language(XML)格式的数据就带来了这种情况。

    通常,管理和共享 XML 数据的一般方法效果不好。文件系统可以应付简单的任务,但是在需要处理大量文档时它们就表现得不好了。并发性、恢复、安全和可用性问题变得难以管理。商业关系数据库管理系统(DBMS)解决了这些问题,但是在其他方面有所欠缺。它们常常提供两种基本的数据库设计选项 —— 将每个 XML 文档完整地存储为一个大型对象,或者将它 “撕开”,分散存储在多个表的多个列中。在许多情况下,这些选项都会导致性能问题、管理困难、查询的复杂性增加和其他问题。最后,纯 XML DBMS 在 IT 基础设施中引入了一种新型的环境,但是这种环境还没有经过考验,它的集成能力、需要的人员技能以及未来的生命力还不确定。

Linux、Unix 和 Windows 平台的 DB2 “Viper” 版引入了另一个可能。这个新的 beta 版可以非常好的支持 XML 数据。为此,IBM 对 DB2 进行了扩展,使其包含:

  • 新的存储技术,可以高效地管理 XML 文档中固有的层次结构。
  • 新的索引技术,可以提高在 XML 文档之间和内部进行搜索的速度。
  • 新的查询语言支持(对于 XQuery)、新的图形化查询构建器(对于 XQuery)和新的查询优化技术。
  • 根据用户提供的模式检验 XML 数据的能力。
  • 新的管理功能,包括对关键数据库工具的扩展。
  • 与流行的应用程序编程接口(API)的集成。

一定要注意,DB2 对 XML 的 “固有” 支持是在对其他技术的现有支持之外 提供的,SQL、表格数据结构和各种 DBMS 特性等现有支持仍然存在。因此,用户可以用一个数据库对象同时管理 “传统的” SQL 数据和 XML 文档。而且,可以编写一个查询同时搜索和处理这两种数据形式。

本文在介绍 DB2 对 XML 的固有支持的同时将研究这些特性。但是,我们先考虑一下为什么说正确地管理 XML 数据是很重要的。


潜在的好处

越来越多的公司开始转到 XML 技术,从而帮助他们实现面向服务的体系结构(SOA)、在不同的系统和应用程序之间交换数据并适应快速变化的业务环境。许多 IT 领导者正在寻找办法高效地共享、搜索和管理公司产生的大量 XML 文档和消息。DB2 新的 XML 支持的设计目的就是为了帮助公司减少存储和使用 XML 数据所需的时间和工作量,进而减少开发费用并提高业务灵活性。

例如,“结合使用 DB2 原生 XML 与 PHP”(developerWorks,2005 年 11 月)解释了 DB2 新的 XML 支持如何减少支持电子商务 Web 站点所需的数据库设计和应用程序代码的复杂性。“Managing XML for Maximum Return”(IBM,2005 年 11 月)讨论了顾客对对比测试场景的体验,这些测试表明新的 XML 支持可能减少工作量和开发时间。

这些好处的背后是什么?DB2 使用户能够完整地存储 XML 文档,同时 DBMS 完全掌握文档的内部结构。这样就避免或减少了其他解决方案涉及的管理任务和程序设计任务。另外,它可以加快文档之间和文档内部的搜索,使顾客能够更快地适应 XML 模式中反映出的业务需求变化。


体系结构概述

DB2 使客户机应用程序能够通过它们选择的查询语言 —— SQL(包括具有 XML 扩展的 SQL,常常称为 “SQL/XML”)或 XQuery —— 同时处理表格数据结构和 XML 数据结构。如 图 1 所示,DB2 中的引擎级组件支持用这两种语言指定的查询。


图 1. 新的 DB2 “Viper” 版的体系结构
DB2 Viper 体系结构

为了高效地管理传统 SQL 数据类型和 XML 数据,DB2 包含两种不同的存储机制。我们将简要地讨论新的 XML 存储技术。但是,一定要注意,给定数据类型所用的底层存储机制对于应用程序是透明的。换句话说,应用程序不需要显式地指定要使用的存储机制,也不需要管理存储的物理方面,比如如何将 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 文档及其层次化表示
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 类型之一(VARCHARVARCHAR HASHEDDOUBLEDATETIMESTAMP)显式地指定数据类型。

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

  • XML 数据上的索引通常只涉及文档(列)内容的一个子集。与此相反,传统 SQL 数据上的索引总是涉及整个列的内容。
  • 表中的一行可能会产生多个 XML 索引项,因为一个 XML 文档可能包含零个、一个或许多个与指定的 xmlpattern 匹配的 “节点”。与此相反,非 XML 索引对于表中的每一行只包含一项。

对于某些应用程序,全文搜索是很重要的。IBM 扩展了 DB2 的文本搜索功能,使其能够搜索 XML 列中存储的数据。对 CREATE INDEX 语句的扩展使管理员能够创建全文索引,从而帮助改进这种搜索的性能。




查询语言和优化

DB2 新的 XML 支持包含新的查询语言功能。程序员现在可以使用 SQL 或 XQuery 搜索数据,XQuery 是一种新的查询语言,支持导航(即基于路径的)表达式。实际上,应用程序可以自由地使用这两种语言的语句,而且一个查询语句可以结合使用 SQL 和 XQuery。

在本文中,我们没时间广泛深入地研究这些功能,所以只讨论几个要点。如果您是没有 XML 经验的 SQL 程序员,那么不必担心,因为用简单的 SQL 语句就能够检索 XML 列中存储的数据内容。例如,下面两个熟悉的查询返回 “items” 表中与特定的库存单位(SKU)相关的所有数据,包括带有顾客评论的 XML 文档:


清单 3. 用 SQL 查询 XML 数据

            select * from items where sku = 112233
            select id, brandname, itemname, sku, srp, comments from items
            where sku = 112233
            

我们现在考虑另一种情况,在这种情况下只想获得 “items” 表的顾客评论中包含的消息,而且希望使用 XQuery 来完成。下面是构造这个语句最简单的方式:


清单 4. 用 XQuery 查询 XML 数据

            xquery db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment/Message
            

因为 DB2 支持两种查询语言,所以用户必须在 XQuery 语句前面加关键词 “xquery”。“db2-fn:xmlcolumn” 函数是指定要查询的目标数据的一种方法。它的参数指定表的 XML 列 —— 在这个例子中是 ITEMS 表的 COMMENTS 列。这个查询还将目标数据进一步限制到 XML 数据的特定子集 —— 即 “Message” 元素的值,这个元素是 “Comment” 元素的子元素,“Comment” 元素本身是根元素 “Comments” 的子元素。(参见 图 2。)

可以使用 FLWOR 表达式构造同样的查询,这种表达式常常与 XQuery 语句相关联。FLWOR 表达式是一种引用 forletwhereorder byreturn 子句的非正式方式。它使程序员能够循环遍历 XML 文档中的节点组并将变量绑定到中间结果。对于这个查询示例,可以使用 forreturn 表达式从顾客评论中获得消息,如下所示:


清单 5. 使用 XQuery 的 FOR 和 RETURN 子句

            xquery for $y in db2-fn:xmlcolumn('ITEMS.COMMENTS')/Comments/Comment
            return ($y/Message)
            

应该注意,DB2 Viper 附带一个 Developer's Workbench,这是一种基于 Eclipse 的开发工具,其中包含的图形化 XQuery 构建器可以帮助用户生成和测试查询。

SQL 和 XQuery 可以组合在一个语句中,从而同时限制对 XML 和非 XML 列的搜索。例如,考虑以下 XQuery 语句:


清单 6. 将 SQL 和 XQuery 组合在一个语句中

            xquery db2-fn:sqlquery('select comments from items
            where srp > 100')/Comments/Comment/Message
            

db2-fn:sqlquery 子句限制了 XQuery 语句的输入;具体地说,只有与建议零售价(srp)大于 $100 的商品相关联的顾客评论才作为输入传递。其他 XQuery 信息表示 DB2 应该只返回这些评论的 “Message” 部分。

许多文章和 Web 站点可以帮助您学习 DB2 的 SQL/XML 扩展、DB2 的 XQuery 支持和新兴的 XQuery 标准(参见 “参考资料” 中的链接。)

最后,关于查询语言还有一个相关的主题:查询优化。DB2 有两个查询语言分析器:一个用于 XQuery,另一个用于 SQL。它们都生成一种通用的与语言无关的内部查询表示。这意味着用这两种语言编写的查询都会从 DB2 的基于开销的查询优化技术获益,这包括高效地重写查询操作符以及选择低开销的数据访问计划。另外,DB2 可以利用新的查询和联结操作符以及新的索引处理技术,为涉及 XML 文档的查询提供更好的运行时性能。




XML 模式和检验

XML 灵活的本质有时候让数据库专业人员对数据质量很担心。正如前面提到的,DB2 允许用户在 XML 数据类型的任何列中存储任何良构的 XML 文档。因此,一个列中可以包含具有不同结构(即模式)和不同内容的文档。如果数据的本质是不清楚的,或者是难以预测的,那么这样的灵活性是绝对必要的。但是在其他情况下,它可能成为麻烦。所以,DB2 允许用户注册他们的模式并要求 DB2 在进行存储之前针对这些模式检验 XML 文档。

XML 模式仅仅是良构的 XML 文档,它们描述了其他文档的结构和内容。例如,XML 模式指定哪些元素是有效的,这些元素在文档中应该以什么次序出现,与每个元素相关联的 XML 数据类型,等等。有各种工具可以帮助您从现有的 XML 文档创建 XML 模式,包括 IBM WebSphere? Studio 系列及其附属品牌 Rational? 产品

在一个列中,用户可以存储与不同模式对应的不同 XML 文档。这显然是因为不断变化的业务需求会影响需要捕捉的 XML 数据的结构和内容。考虑前面的 “items” 表,假设在部署这个表几个月之后,决定在 XML 列中捕捉其他信息,比如更多的顾客联系信息、响应某些评论的操作的记录等等。DB2 可以适应这些新的内容,并不需要改变表的结构或依赖于这个表的应用程序。实际上,现有的数据(基于 “旧的” XML 模式)仍然存在,同时可以添加符合一个或多个新模式的新数据。按照这种方式,管理员可以以最少的部署时间和开销支持新的业务需求。而且,他们不会损害 XML 的完整性 —— 他们只是向 DB2 提供新的信息,说明某种 XML 数据也是 “有效的”。

在 DB2 的内部存储库中注册 XML 模式是很简单的。DB2 提供了存储过程来使这个过程自动化,管理员也可以手动发出相应的命令。如果需要,可以使用一个模式检验多个表中的多个 XML 列。




管理支持

DB2 新的 XML 支持包括对熟悉的管理工具的扩展,可以帮助管理员管理和调整数据库。例如,备份和恢复设施(包括用于故障恢复的高可用性数据复制)都支持 XML 列中存储的文档。同样,对 IMPORTEXPORT 的扩展现在可以同时在传统 SQL 数据和 XML 数据上操作。因此,可以发出一个 IMPORT 命令来填充整个 “items” 表(从原始文件读取 XML 数据),发出一个 EXPORT 命令将所有表数据写到外部文件。

另外,DB2 的图形化管理工具 DB2 Control Center 使管理员能够浏览包含 XML 数据的表、创建和管理基于 XML 的索引、发出 SQL/XML 和 XQuery 语句以及执行许多其他管理任务。因为性能常常是关注的重点,相应的 DB2 设施也进行了扩展来适应 XML 数据。这些设施包括 DB2 Snapshot Monitor,它提供对某一时刻 DB2 活动的汇总(即 “快照”);RUNSTATS,它收集 DB2 数据库中存储的数据的统计信息;以及 EXPLAIN,它报告查询优化器为满足给定请求所选择的访问路径。管理员可以通过研究 EXPLAIN 的输出来判断使用了哪些 XML 索引。





程序语言扩展

如果程序员无法可靠地访问数据库中存储的 XML 数据,那么 DB2 新的 XML 支持的意义就不大了。由于认识到了这一点,IBM 对它的各种编程语言接口进行了增强,从而支持轻松地访问 XML 数据。这些增强覆盖 Java?(JDBC)、C(嵌入式 SQL 和调用级接口)、COBOL(嵌入式 SQL)、PHP 和 Microsoft? 的 .NET 环境(通过 DB2.NET 数据提供程序)。

因为应用程序编程接口(API)与使用的编程语言相关,我们无法在这里一一讨论这些扩展。可以在最近发表的论文 “Native XML Support in DB2 Universal Database” 中读到对这些扩展的总结(参阅 “参考资料”),还可以阅读文章 “结合使用 DB2 原生 XML 与 PHP”。



结束语

DB2 Viper 版是 IBM 的第一个 “混合型”(即多结构)数据库管理系统实现。除了支持表数据模型之外,DB2 还支持 XML 文档和消息中固有的层次化数据模型。用户可以在一个表中自由地混合存储传统 SQL 数据和 XML 数据。还可以使用 SQL(如果愿意,可以加上 XML 扩展)和 XQuery(新出现的 XML 数据查询标准)来查询和处理这两种形式的数据。通过在经过实践检验的数据库管理基础设施上进行扩展,IBM 为 DB2 Viper 用户提供了同时处理关系数据和 XML 数据的强大支持。

致谢

感谢 Grant Hutchison、Matthias Nicola 和 Gary Robinson 审阅了本文。

0
相关文章