pureXML 技术概述

转自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0905purexml/
pureXML 是一个新的 DB2 9 特性,它能够在数据库表中以原有格式存储 XML 数据。本文介绍 pureXML 功能和特性。

传统的 XML 数据管理方法

IBM 为社区提供了 DB2 免费版本 DB2 Express-C,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。


在 DB2 9 之前,管理 XML 数据通常有以下方式:

  • 把 XML 文档存储在文件系统中
  • 把 XML 数据整体存储在关系数据库中的大对象 (LOB) 中
  • 把 XML 数据分解存储在多个关系列和表中
  • 把数据隔离在纯 XML 数据库系统中

这些管理和共享 XML 数据的方法常常无法满足性能需求。文件系统很适合简单的任务,但是在有大量文档时它们的可伸缩性很差。并发性、恢复、安全性和易用性问题会变得难以管理。 使用数据库管理系统 (DBMS) 可以缓解文件系统的一些问题,但是 DBMS 以前在管理 XML 数据方面也有一些限制。使用关系数据库管理系统 (RDBMS) 的两种常用方法称为整体存储 (stuffing) 和分解 (shredding)。

  • 整体存储 把 XML 文档作为一个整体存储在关系数据库中的 VARCHAR 或大对象(CLOB 或 BLOB)列中。如果只需要存储和获取完整的 XML 文档,这种方法是很有效的。但是,如果要查询 XML 文档的内容,或者获取片段或特定的元素/属性/子树,那么在运行时要扫描每个文档,这非常不实用,性能开销非常大。
  • 分解 把 XML 数据映射到关系列和表。为了把 XML 存储在数据库中,要把 XML 文档分解为小块(元素和属性),然后把它们存储在单独的列中,这个过程有一些开销。XML 数据的复杂度和规范化规则可能导致 XML 文档被分散到几十个表中的数百个列中。同样,在重新构造文档时,必须通过复杂的查询和多表联结访问所有这些列和表,这会引入不必要的复杂性。有时候,甚至 不可能重新构造一些文档,某些数据可能会“失真”,比如数字签名。另外,这种方法还会导致关系数据模型的严谨性限制 XML 数据格式的灵活性。
  • 在近几年,出现了许多专门处理 XML 数据的 DBMS,它们能够感知 XML 数据结构,可以更高效地管理 XML 数据。但是这些 XML DBMS 大都相当新,使用它们会在 IT 基础结构中引入尚未证明有效的环境,在与传统数据的集成、人员技能和长期生存能力方面导致新的问题。
  • DB2 9 的 XML 数据管理

    随着 DB2 9 的发布,IBM 开启了数据管理领域的新纪元。DB2 9 提供 pureXML 服务。pureXML 技术并非只针对数据服务器的外部接口,而是扩展到了 DB2 引擎的核心。在 DB2 9中,XML 和关系服务紧密集成,从而提供业内第一种 pureXML 和关系混合型数据服务器。图 1 给出这种混合型数据库的概况。


    图 1. pureXML 和关系混合型数据库
    pureXML 和关系混合型数据库

    DB2 9 中的 pureXML 技术包含以下功能:

  • pureXML 数据类型和存储技术,能够高效地管理 XML 文档中常见的层次化结构。
  • pureXML 索引技术,能够快速地搜索 XML 文档的子树。
  • 基于行业标准的新的查询语言支持(XQuery 和 SQL/XML)和新的查询优化技术。
  • 对管理、检验和演化 XML 模式的支持。
  • 全面的管理功能,包括对流行的数据库实用程序的扩展。
  • 与流行的应用程序编程接口 (API) 和开发环境的集成。
  • XML 分解和发布功能,能够处理现有的关系模式。
  • 保持了 DB2 原有的可靠性、可用性、可伸缩性、性能、安全性和成熟度。

在下面几节中,详细介绍其中一些功能以及使用它们的方法。

设置用于存储 XML 的数据库

在 DB2 9 中,创建用于存储 XML 数据的数据库与创建用于存储关系数据的数据库并没有区别,因为可以在同一数据库中同时存储和访问这两种数据。但是,因为 XML 数据通常采用 Unicode 编码,在 DB2 V9.1 中必须使用 Unicode 设置创建数据库:

CREATE DATABASE test USING CODESET utf-8 TERRITORY US

针对 XML 优化的存储和 XML 数据类型

XML 数据本质上是层次化的,可以自然地表示为树形式,包含具有父、子、同胞关系的节点。在 DB2 9 中,表可以包含一个或多个基于新的 XML 数据类型的列,这些列保存 XML 文档的集合。其他一些 RDBMS 提供的 XML 数据类型在幕后把 XML 数据转换和存储为关系构造,而 DB2 提供的 XML 数据类型存储经过解析的 XML 文档和片段,具有节点级粒度,可以保留 XML 数据原来的层次结构。DB2 中的 XML 数据类型并不把 XML 数据转换为关系数据类型,也没有相关联的开销,能够高效地访问 XML 数据或其特定部分。

可以创建同时包含关系和 XML 数据类型的表:

CREATE TABLE orders (orderid INT, orderinfo XML)

在表中可以不创建任何关系列;如果愿意,可以同时有多个 XML 类型的列和多个关系类型的列:

CREATE TABLE o2 (oid INT, otype CHAR(2), ocust XML, oinfo XML)

把 XML 数据输入数据库

很容易使用 INSERT 语句把 XML 数据输入用 XML 数据类型创建的表中。如果必须用大量 XML 文档填充数据库,可以调用 IMPORT 命令。与关系数据一样,可以通过用户应用程序、DB2 图形化工具或 DB2 命令行界面执行这些操作。清单 1 把一个 XML 文档插入到 ORDERS 表中。


清单1. 插入 XML 文档
INSERT INTO orders (orderid, orderinfo) VALUES (5,
'
2006-07-07

XYZ
12345

Fragile Contents
'

查询 XML 数据

DB2 9 支持关系和 XML 程序员熟悉的查询语言。可以使用 SQL 或 XQuery 访问数据,XQuery 是一种支持导航(即基于路径的)表达式的新型查询语言。实际上,应用程序可以自由地选用这两种查询语言的语句,一个查询语句实际上可以结合使用 SQL 和 XQuery。查询的结果可以以关系和 XML 格式返回数据,也可以是两者的组合。

下面看几个示例,它们使用 ORDERS 表和清单 1 中插入此表中的文档。清单 2 中的查询使用 SQL 同时访问关系和 XML 数据:


清单 2. 使用 SQL 同时访问关系和 XML 数据
SELECT * FROM orders WHERE rderid=5
SELECT orderinfo FROM orders

请考虑清单 3 中的 XQuery。这个查询返回清单 1 中插入的完整 XML 文档。


清单 3. 使用 XQuery 访问 XML 数据
XQUERY db2-fn:xmlcolumn('ORDERS.ORDERINFO');

清单 4 中的 XQuery 从 orders 表中的 XML 文档获取订单日期。


清单 4. 使用 XQuery 访问 XML 文档的一部分
XQUERY
for $d in db2-fn:xmlcolumn('ORDERS.ORDERINFO')/order/orderdate
return $d;
结果:

2006-07-07
文档选项

未显示需要 JavaScript. 的文档选项

将打印机的版面设置成横向打印模式

打印本页

将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 初级

developerWorks 中国网站编辑团队, 编辑, IBM

2009 年 5 月 11 日

pureXML 是一个新的 DB2 9 特性,它能够在数据库表中以原有格式存储 XML 数据。本文介绍 pureXML 功能和特性。

传统的 XML 数据管理方法

IBM 为社区提供了 DB2 免费版本 DB2 Express-C,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。

DB2 Express-C

在 DB2 9 之前,管理 XML 数据通常有以下方式:

  • 把 XML 文档存储在文件系统中
  • 把 XML 数据整体存储在关系数据库中的大对象 (LOB) 中
  • 把 XML 数据分解存储在多个关系列和表中
  • 把数据隔离在纯 XML 数据库系统中

这些管理和共享 XML 数据的方法常常无法满足性能需求。文件系统很适合简单的任务,但是在有大量文档时它们的可伸缩性很差。并发性、恢复、安全性和易用性问题会变得难以管理。 使用数据库管理系统 (DBMS) 可以缓解文件系统的一些问题,但是 DBMS 以前在管理 XML 数据方面也有一些限制。使用关系数据库管理系统 (RDBMS) 的两种常用方法称为整体存储 (stuffing) 和分解 (shredding)。

  • 整体存储 把 XML 文档作为一个整体存储在关系数据库中的 VARCHAR 或大对象(CLOB 或 BLOB)列中。如果只需要存储和获取完整的 XML 文档,这种方法是很有效的。但是,如果要查询 XML 文档的内容,或者获取片段或特定的元素/属性/子树,那么在运行时要扫描每个文档,这非常不实用,性能开销非常大。
  • 分解 把 XML 数据映射到关系列和表。为了把 XML 存储在数据库中,要把 XML 文档分解为小块(元素和属性),然后把它们存储在单独的列中,这个过程有一些开销。XML 数据的复杂度和规范化规则可能导致 XML 文档被分散到几十个表中的数百个列中。同样,在重新构造文档时,必须通过复杂的查询和多表联结访问所有这些列和表,这会引入不必要的复杂性。有时候,甚至 不可能重新构造一些文档,某些数据可能会“失真”,比如数字签名。另外,这种方法还会导致关系数据模型的严谨性限制 XML 数据格式的灵活性。
  • 在近几年,出现了许多专门处理 XML 数据的 DBMS,它们能够感知 XML 数据结构,可以更高效地管理 XML 数据。但是这些 XML DBMS 大都相当新,使用它们会在 IT 基础结构中引入尚未证明有效的环境,在与传统数据的集成、人员技能和长期生存能力方面导致新的问题。




回页首


DB2 9 的 XML 数据管理

随着 DB2 9 的发布,IBM 开启了数据管理领域的新纪元。DB2 9 提供 pureXML 服务。pureXML 技术并非只针对数据服务器的外部接口,而是扩展到了 DB2 引擎的核心。在 DB2 9中,XML 和关系服务紧密集成,从而提供业内第一种 pureXML 和关系混合型数据服务器。图 1 给出这种混合型数据库的概况。


图 1. pureXML 和关系混合型数据库
pureXML 和关系混合型数据库

DB2 9 中的 pureXML 技术包含以下功能:

  • pureXML 数据类型和存储技术,能够高效地管理 XML 文档中常见的层次化结构。
  • pureXML 索引技术,能够快速地搜索 XML 文档的子树。
  • 基于行业标准的新的查询语言支持(XQuery 和 SQL/XML)和新的查询优化技术。
  • 对管理、检验和演化 XML 模式的支持。
  • 全面的管理功能,包括对流行的数据库实用程序的扩展。
  • 与流行的应用程序编程接口 (API) 和开发环境的集成。
  • XML 分解和发布功能,能够处理现有的关系模式。
  • 保持了 DB2 原有的可靠性、可用性、可伸缩性、性能、安全性和成熟度。

在下面几节中,详细介绍其中一些功能以及使用它们的方法。





回页首


设置用于存储 XML 的数据库

在 DB2 9 中,创建用于存储 XML 数据的数据库与创建用于存储关系数据的数据库并没有区别,因为可以在同一数据库中同时存储和访问这两种数据。但是,因为 XML 数据通常采用 Unicode 编码,在 DB2 V9.1 中必须使用 Unicode 设置创建数据库:

CREATE DATABASE test USING CODESET utf-8 TERRITORY US





回页首


针对 XML 优化的存储和 XML 数据类型

XML 数据本质上是层次化的,可以自然地表示为树形式,包含具有父、子、同胞关系的节点。在 DB2 9 中,表可以包含一个或多个基于新的 XML 数据类型的列,这些列保存 XML 文档的集合。其他一些 RDBMS 提供的 XML 数据类型在幕后把 XML 数据转换和存储为关系构造,而 DB2 提供的 XML 数据类型存储经过解析的 XML 文档和片段,具有节点级粒度,可以保留 XML 数据原来的层次结构。DB2 中的 XML 数据类型并不把 XML 数据转换为关系数据类型,也没有相关联的开销,能够高效地访问 XML 数据或其特定部分。

可以创建同时包含关系和 XML 数据类型的表:

CREATE TABLE orders (orderid INT, orderinfo XML)

在表中可以不创建任何关系列;如果愿意,可以同时有多个 XML 类型的列和多个关系类型的列:

CREATE TABLE o2 (oid INT, otype CHAR(2), ocust XML, oinfo XML)





回页首


把 XML 数据输入数据库

很容易使用 INSERT 语句把 XML 数据输入用 XML 数据类型创建的表中。如果必须用大量 XML 文档填充数据库,可以调用 IMPORT 命令。与关系数据一样,可以通过用户应用程序、DB2 图形化工具或 DB2 命令行界面执行这些操作。清单 1 把一个 XML 文档插入到 ORDERS 表中。


清单1. 插入 XML 文档
INSERT INTO orders (orderid, orderinfo) VALUES (5,
'
2006-07-07

XYZ
12345

Fragile Contents
'
);





回页首


查询 XML 数据

DB2 9 支持关系和 XML 程序员熟悉的查询语言。可以使用 SQL 或 XQuery 访问数据,XQuery 是一种支持导航(即基于路径的)表达式的新型查询语言。实际上,应用程序可以自由地选用这两种查询语言的语句,一个查询语句实际上可以结合使用 SQL 和 XQuery。查询的结果可以以关系和 XML 格式返回数据,也可以是两者的组合。

下面看几个示例,它们使用 ORDERS 表和清单 1 中插入此表中的文档。清单 2 中的查询使用 SQL 同时访问关系和 XML 数据:


清单 2. 使用 SQL 同时访问关系和 XML 数据
SELECT * FROM orders WHERE rderid=5
SELECT orderinfo FROM orders

请考虑清单 3 中的 XQuery。这个查询返回清单 1 中插入的完整 XML 文档。


清单 3. 使用 XQuery 访问 XML 数据
XQUERY db2-fn:xmlcolumn('ORDERS.ORDERINFO');

清单 4 中的 XQuery 从 orders 表中的 XML 文档获取订单日期。


清单 4. 使用 XQuery 访问 XML 文档的一部分
XQUERY
for $d in db2-fn:xmlcolumn('ORDERS.ORDERINFO')/order/orderdate
return $d;
结果:

2006-07-07


最后,清单 5. 组合使用 SQL 和 XQuery。第一个语句是 SQL/XML 语句,下一个语句在 XQuery 中嵌入了 SQL。


清单 5. 组合 SQL 和 XQuery
-- retrieve the orderid of orders for a specific customer 'XYZ'
SELECT orderid FROM orders
WHERE xmlexists('$o[order/customer/name="XYZ"]'
PASSING orderinfo AS "o");
-- retrieve info for orders matching specified criteria
XQUERY db2-fn:sqlquery(
"SELECT orderinfo FROM orders WHERE orderid > 3"
)/order/customer[zip = "12345"];





回页首


针对 XML 的查询优化和索引

DB2 有两个查询语言解析器:一个用于 XQuery,另一个用于 SQL。这两个解析器相互协作,为查询生成通用的与语言无关的内部表示。这意味着用两种语言编写的查询都可以充分利用 DB2 的基于成本的查询优化技术,这包括高效地重写查询操作符以及选择低成本的数据访问计划。另外,DB2 可以使用新的查询和联结操作符以及新的索引处理技术,从而为涉及 XML 文档的查询提供出色的运行时性能。

除了新的 XML 层次化存储管理支持之外,DB2 9 还提供新的索引技术,能够加快涉及 XML 数据的搜索。与关系索引一样,XML 索引也是用 SQL DDL 语句 CREATE INDEX 创建的。但是,除了指定要编制索引的目标列之外,用户还要指定 xmlpattern,这是一个没有谓词的 XPath,用来指定感兴趣的 XML 文档部分。清单 6 给出一个 CREATE INDEX 语句。


清单 6. 创建 XML 索引
CREATE INDEX odindex ON orders(orderinfo) GENERATE

XML 模式存储库和检验

DB2 提供一个 XML 模式存储库,可以在这里注册用于检验 XML 文档的模式。XML 模式是良构的 XML 文档,它们指定其他文档的结构和内容。例如,XML 模式指定哪些元素是有效的,这些元素应该以什么次序出现在文档中,以及与每个元素相关联的 XML 数据类型是什么。

为了适应 XML 的灵活性,DB2 9 为检验 XML 数据提供了许多选项。根据需求不同,可以选择不在插入数据库之前检验 XML 数据,这样就允许单一 XML 列包含具有不同模式的文档。

但是,如果业务需求要求 XML 文档符合特定的模式,那么可以使用已经向 DB2 注册的模式检验文档。另外,可以用不同版本的模式检验同一 XML 列中的文档。因此,在业务需求发生变化时,可以快速地改变模式(也称为模式演化)。通过使用清单 7 中的 INSERT 语句,在插入期间会检验 XML 文档。


清单 7. 在插入 XML 数据时进行检验
INSERT INTO orders(orderinfo) VALUES XMLVALIDATE(?

XML 的全文搜索

全文搜索是以文档为中心的 XML 应用程序中的常见操作。DB2 现有的文本搜索功能 (Net Search Extender) 已经改进了,可以处理新的 XML 列类型。在 DB2 9 中,可以在任何 XML 列上定义全文索引,这些索引能够感知 XML 文档结构。可以对 XML 列中的文档完整地编制索引,也可以部分地编制索引;例如,如果事先知道全文搜索只涉及每个文档的特定部分,比如 description comment 元素,就可以部分地编制索引。与此相应,文本搜索表达式可以应用于文档中的特定路径。

带注解的模式分解

尽管 DB2 9 可以插入和存储任何 XML 文档,但是在某些情况下把 XML 文档分解存储到关系行和列中仍然是有意义的。在某些使用场景中,XML 只用来向数据库传输数据,在数据与现有的关系数据集成之后,XML 结构就没用了。另外,许多现有的数据挖掘和业务智能化工具只使用关系格式的数据,所以也需要分解 XML 文档。DB2 提供一种改进的分解功能,能够把 XML 数据自动地映射到关系表。

应用程序开发支持

作为 pureXML 技术的固有部分,DB2 9 为开发以 XML 为中心的和混合型的应用程序提供了丰富的支持,能够简化编码、减少开发时间和改进应用程序修改的敏捷性。DB2 9 中的 XML 开发支持包括:

  • 支持常用的编程语言和应用程序接口
      • 语言:C/C++、Java™、C#、Visual Basic®、Cobol、PHP
      • 接口:JDBC™、CLI / ODBC、.NET、Embedded SQL、SQLJ
  • 支持使用 XQuery 和 SQL/XML(或同时使用这两种技术)查询数据
  • 在 Developer Workbench 中提供全面的 XML 功能(包括 XQuery 构建器)
  • 与 Visual Studio® 和 .NET 紧密地集成
  • 提供新的代码示例,改进了 DB2 SAMPLE 数据库

例如,DB2 支持通过 JDBC 处理 XML;针对 XML 数据改进了 Universal DB2 for JDBC 驱动程序。可以使用 Java 数据类型(比如字符串、字节数组和流)绑定查询结果、输入和输出参数的 XML 数据。因为 JDBC 3.0 当前没有定义原生 XML 数据类型,DB2 提供一种扩展 XML 类型 com.ibm.db2.DB2Xml。DB2Xml 扩展提供许多非常有用的方法,可以轻松地处理 XML 数据。在清单 8 中,以 DB2 XML 对象的形式获取一列。然后,getDB2String 方法以字符串对象的形式返回 XML 值的序列化表示(不包含 XML 声明)。然后,getDB2XML BinaryStream (“UTF-16”) 方法返回一个二进制流,其中包含用 UTF-16 编码的 XML 值,包括匹配的 XML 声明。


清单 8. 使用 DB2 提供的 JDBC 扩展访问 XML 数据
com.ibm.db2.jcc.DB2Xml xml1 =
(com.ibm.db2.jcc.DB2Xml) rs.getObject (“xml_stuff”);
String s = xml1.getDB2String();

工具和实用程序

大多数标准的 DB2 工具和实用程序已经改进了,集成了对 pureXML 技术的支持:

  • Import/Export:把 XML 文档导入和导出数据库
  • Backup/Restore:与关系数据一起备份和恢复 XML 数据
  • Runstats:更新查询优化所用的统计数据
  • High Availability and Disaster Recovery (HADR):使用辅助或离站系统
  • 高级安全性:包括细粒度的基于标签的访问控制
  • 存储过程:能够通过参数传递 XML 文档

DB2 中的许多图形化工具和界面也针对 XML 改进了。例如,可以使用 Control Center 导航和查看 XML 对象,在创建表时以图形化方式指定 XML 数据类型,构建 XML 索引表达式,执行涉及 XML 的查询,用 Visual Explain 查看查询访问路径和索引使用情况。可以使用 XQuery 构建器(DB2 Developer Workbench 中的组件)的拖放功能轻松地开发非常复杂的 XQuery 语句。

DB2 pureXML 技术的益处

通过使用 DB2 9 中的混合型数据管理,可以用同一个数据服务器同时存储关系和 XML 数据,这种数据库技术先进、容易使用、基于标准而且已经经过实践检验。无论您是希望支持任务关键的解决方案,还是想在小型业务应用程序中嵌入 DB2 数据服务器的免费版本,DB2 9 和 pureXML 都可以:

  • 减少开发时间 简化代码,避免在应用程序中进行 XML-关系转换。
  • 提高敏捷性 支持灵活的 XML 模式演化,在修改或创建服务、产品或业务过程时,能够快速地修改应用程序。
  • 提高监察能力 监控以前难以管理的 XML 数据,通过针对 XML 优化的存储和索引实现更快的查询处理。

例如,欧洲的大型金融服务公司 Storebrand Group 使用 DB2 9 pureXML 技术支持他们的 SOA 解决方案,取得了巨大的收益。通过使用 DB2 pureXML,以前在使用关系数据库时要花费 2 到 8 小时的开发任务现在只需不到 30 分钟。在使用关系数据模型时,修改模式往往要花费一周时间,现在使用 DB2 9 只需要几分钟。以前,针对分解的 XML 数据的查询要运行好几天,现在使用 pureXML 只需要几秒或几分钟。

InputStream is = xml1.getDB2XMLBinaryStream(“UTF-16”);
ACCORDING TO XMLSCHEMA ID order.ordschema)
KEY USING XMLPATTERN '/order/orderdate' as SQL DATE;


最后,清单 5. 组合使用 SQL 和 XQuery。第一个语句是 SQL/XML 语句,下一个语句在 XQuery 中嵌入了 SQL。


清单 5. 组合 SQL 和 XQuery
-- retrieve the orderid of orders for a specific customer 'XYZ' SELECT orderid FROM orders WHERE xmlexists('$o[order/customer/name="XYZ"]' PASSING orderinfo AS "o"); -- retrieve info for orders matching specified criteria XQUERY db2-fn:sqlquery( "SELECT orderinfo FROM orders WHERE orderid > 3" )/order/customer[zip = "12345"];
);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-623928/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-623928/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值