pureXML 是一个新的 DB2 9 特性,它能够在数据库表中以原有格式存储 XML 数据。本文介绍 pureXML 功能和特性。
|
在 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 的发布,IBM 开启了数据管理领域的新纪元。DB2 9 提供 pureXML 服务。pureXML 技术并非只针对数据服务器的外部接口,而是扩展到了 DB2 引擎的核心。在 DB2 9中,XML 和关系服务紧密集成,从而提供业内第一种 pureXML 和关系混合型数据服务器。图 1 给出这种混合型数据库的概况。
图 1. pureXML 和关系混合型数据库DB2 9 中的 pureXML 技术包含以下功能:
- pureXML 数据类型和存储技术,能够高效地管理 XML 文档中常见的层次化结构。
- pureXML 索引技术,能够快速地搜索 XML 文档的子树。
- 基于行业标准的新的查询语言支持(XQuery 和 SQL/XML)和新的查询优化技术。
- 对管理、检验和演化 XML 模式的支持。
- 全面的管理功能,包括对流行的数据库实用程序的扩展。
- 与流行的应用程序编程接口 (API) 和开发环境的集成。
- XML 分解和发布功能,能够处理现有的关系模式。
- 保持了 DB2 原有的可靠性、可用性、可伸缩性、性能、安全性和成熟度。
在下面几节中,详细介绍其中一些功能以及使用它们的方法。
在 DB2 9 中,创建用于存储 XML 数据的数据库与创建用于存储关系数据的数据库并没有区别,因为可以在同一数据库中同时存储和访问这两种数据。但是,因为 XML 数据通常采用 Unicode 编码,在 DB2 V9.1 中必须使用 Unicode 设置创建数据库:
CREATE DATABASE test USING CODESET utf-8 TERRITORY US
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)很容易使用 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
'
DB2 9 支持关系和 XML 程序员熟悉的查询语言。可以使用 SQL 或 XQuery 访问数据,XQuery 是一种支持导航(即基于路径的)表达式的新型查询语言。实际上,应用程序可以自由地选用这两种查询语言的语句,一个查询语句实际上可以结合使用 SQL 和 XQuery。查询的结果可以以关系和 XML 格式返回数据,也可以是两者的组合。
下面看几个示例,它们使用 ORDERS 表和清单 1 中插入此表中的文档。清单 2 中的查询使用 SQL 同时访问关系和 XML 数据:
清单 2. 使用 SQL 同时访问关系和 XML 数据
SELECT * FROM orders WHERE rderid=5 |
请考虑清单 3 中的 XQuery。这个查询返回清单 1 中插入的完整 XML 文档。
清单 3. 使用 XQuery 访问 XML 数据
XQUERY db2-fn:xmlcolumn('ORDERS.ORDERINFO'); |
清单 4 中的 XQuery 从 orders 表中的 XML 文档获取订单日期。
清单 4. 使用 XQuery 访问 XML 文档的一部分
XQUERY
|
级别: 初级
developerWorks 中国网站编辑团队, 编辑, IBM
2009 年 5 月 11 日
pureXML 是一个新的 DB2 9 特性,它能够在数据库表中以原有格式存储 XML 数据。本文介绍 pureXML 功能和特性。
传统的 XML 数据管理方法
|
在 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 和关系混合型数据库
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, |
|
查询 XML 数据
DB2 9 支持关系和 XML 程序员熟悉的查询语言。可以使用 SQL 或 XQuery 访问数据,XQuery 是一种支持导航(即基于路径的)表达式的新型查询语言。实际上,应用程序可以自由地选用这两种查询语言的语句,一个查询语句实际上可以结合使用 SQL 和 XQuery。查询的结果可以以关系和 XML 格式返回数据,也可以是两者的组合。
下面看几个示例,它们使用 ORDERS 表和清单 1 中插入此表中的文档。清单 2 中的查询使用 SQL 同时访问关系和 XML 数据:
清单 2. 使用 SQL 同时访问关系和 XML 数据
SELECT * FROM orders WHERE rderid=5 |
请考虑清单 3 中的 XQuery。这个查询返回清单 1 中插入的完整 XML 文档。
清单 3. 使用 XQuery 访问 XML 数据
XQUERY db2-fn:xmlcolumn('ORDERS.ORDERINFO'); |
清单 4 中的 XQuery 从 orders 表中的 XML 文档获取订单日期。
清单 4. 使用 XQuery 访问 XML 文档的一部分
XQUERY |
最后,清单 5. 组合使用 SQL 和 XQuery。第一个语句是 SQL/XML 语句,下一个语句在 XQuery 中嵌入了 SQL。
清单 5. 组合 SQL 和 XQuery
-- retrieve the orderid of orders for a specific customer 'XYZ' |
|
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 DB2 提供一个 XML 模式存储库,可以在这里注册用于检验 XML 文档的模式。XML 模式是良构的 XML 文档,它们指定其他文档的结构和内容。例如,XML 模式指定哪些元素是有效的,这些元素应该以什么次序出现在文档中,以及与每个元素相关联的 XML 数据类型是什么。 为了适应 XML 的灵活性,DB2 9 为检验 XML 数据提供了许多选项。根据需求不同,可以选择不在插入数据库之前检验 XML 数据,这样就允许单一 XML 列包含具有不同模式的文档。 但是,如果业务需求要求 XML 文档符合特定的模式,那么可以使用已经向 DB2 注册的模式检验文档。另外,可以用不同版本的模式检验同一 XML 列中的文档。因此,在业务需求发生变化时,可以快速地改变模式(也称为模式演化)。通过使用清单 7 中的 INSERT 语句,在插入期间会检验 XML 文档。 清单 7. 在插入 XML 数据时进行检验
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/