技术开发 频道

详解DB2中自定义XML存储及其使用环境

  【IT168 技术文档】使用IBM DB2 for z/OS和DB2 for Linux,UNIX和Windows (LUW),那就没有问题,下面让我们一起回顾一下什么时候使用XML存储,以及如何自定义XML存储的一些非常好的实践吧!

  为了形象地说明,我将使用一个XML文档,内容如下:

<order OrderID="9001" OrderDate="2009-1018">>  
<customerID>26914</customerID>  
<item id="LK-486">  
<name>Magic Potion</name>   <size>300ml</size>  
<price>19.99</price>  
</item>  
<item id="VF-145">  
<name>Crystal Ball, Deluxe</name>   <color>crystal clear</color>   <price>295.00</price>  
</item> </order>

        它展示了一个包括订单ID,日期,客户ID和其它条目的订单XML文档,注意有些条目的描述方式有所不同,如size和color。我们假设需要在DB2中管理许多与此类似的XML文档。

  如何拆分和重组XML

  我在另一篇文章“15个DB2 pureXML性能非常好的实践”中谈到了你应该明智地选择文档的粒度,实际上就是要将存储在DB2中的XML文档与应用程序的业务逻辑对象和主要的访问粒度匹配。

  在我们的例子中,假设订单变化非常频繁,订单内的条目读取,添加或删除是最关键的操作,需要非常好的的性能,在这种情况下,你可以考虑将订单文档拆分,将每一个条目作为一个独立的文档存储到DB2表的每一行中,这个存储方法(与原来的完整存储订单文档的方法相比)的好处是它使得操作所存储的数据更容易,更快速:

  可以使用单行读取检索一个条目,不用从一个完整的订单文档中抽取条目了;

  可以通过删除表中的行简单地从订单中删除一个条目,不再需要操作完整的订单文档;

  可以迅速插入一个新条目到订单中,这时也不需要操作完整的订单文档。

  这种轻松添加和移除订单条目的功能在DB2 9 for z/OS中尤其有价值,因为这个版本不支持在现有XML文档中添加或删除元素。

  下面的代码显示了一个表的定义,以及拆分一个订单文档的INSERT语句,相关的列分别存储订单ID,客户ID,订单日期和一个条目流水号。

CREATE TABLE items(ordID INTEGER, custID INTEGER,                                     odate DATE, seqNo INTEGER, item XML);  
INSERT INTO items(ordID, custID, odate, seqno, item)  
SELECT T.ordID, T.custID, T.odate, T.seqno, XMLDOCUMENT( T.item)  
FROM  
XMLTABLE('$d/order/item' PASSING cast(? AS XML) "d"    
COLUMNS      
ordID        INTEGER  PATH      '../@OrderID',      
custID       INTEGER    PATH      '../customerID'    
odate        DATE       PATH      '../@OrderDate',      
seqNo        FOR ORDINALITY,      
item         XML        PATH      '.') AS T;

  条目信息是以XML格式存储的,因为条目可能有不同的元素和属性,如:
ORDID CUSTID ODATE SEQNO ITEM
----- ----- ------ ----- -----
9001 26914 10/18/2009 1<item id="LK-486">
<name>Magic Potion</name>
<size>300ml</size>
<price>19.99</price>
</item>
9001 26914 10/18/2009 2 <item id="VF-145">
<name>Crystal Ball, Deluxe</name>
<color>crystal clear</color>
<price>295.00</price>
</item>
2 record(s) selected.

  INSERT语句包括一个XMLTABLE函数,这个函数从输入XML文档抽取插入items表中的值,它将会拆分输入XML文档,生成独立条目的文档。XMLTABLE函数包括一个参数,通过它,应用程序可以传递一个订单文档,使用XPath表达式$d/order/item,XMLTABLE函数为输入文档的每一个条目生成一行数据,然后抽取订单ID,客户ID和订单日期,特殊的列定义FOR ORDINALITY为产生的每一行打上编号。XMLDOCUMENT函数确保每一个条目片段可以作为一个独立的XML文档插入。

  上面的代码显示了使用INSERT语句插入XML文档后items表中的数据,下面的代码显示了如何重建原始的订单文档,XMLELEMENT和XMLATTRIBUTES函数使用items表中相关列的值构建的顶部文档,XMLAGG函数组合所有条目,最后形成一个完整的订单文档。注意,XMLAGG在seqno列上包括一个可选的ORDER BY子句,这样可以确保还原后的订单文档和原始文档中的条目显示顺序是一致的。

SELECT XMLELEMENT(name "order",           XMLATTRIBUTES(ordID AS "OrderID", odateas "OrderDate"),          
XMLELEMENT(name "customerID",custID)           XMLAGG(item ORDER BY seqno) )  
FROM items  
WHERE ordID = 9001  
GROUP BY ordID, odate, custID

 

0
相关文章