Storing XML in Relational Databases(2)

From http://www.xml.com

IBM DB2 XML 扩展

SQL XML 的映射

在用DB2作为XML存储库时,IBM的XML扩展提供了两种访问和存储的方法:

1.        XML列:从一个列中存储和得到整个XML文档。

2.        XML集合:把XML文档分解成一系列的关系表,或者从一系列的关系表中重组成一个XML文档。

DTDs存储在DTD 库中,在DB2中是一个被称为DTD_REF 的表。它的模式名称叫“db2xml“。每个在DTD_REF中的DTD都有一个唯一的标识ID,数据表和XML文档结构之间的映射被一个数据访问定义(DAD)文件进行定义,DAT引用一个处理过的文档DTD,因此它在XML文档,此文档的DTD和映射至数据库表的规则之间提供了一个桥梁。

以下是一个DAD的例子:

<?xml version="1.0"?>

<!DOCTYPE    DAD    SYSTEM    "dad.dtd">

<DAD>

<dtdid>FXTRADE.DTD</dtdid>

<validation>YES</validation>

<Xcollection>

<prolog>?xml version="1.0"?</prolog>

<doctype>!DOCTYPE     FXTRADE       FXTRADE.DTD </doctype>

<root_node>

<element_node     name="FXTRADE">

<RDB_node>

<table name="FXTRADE"/>

<table name="ACCOUNT" key="ID"/>

<condition>

FXTRADE.ACCOUNT=ACCOUNT.ID

</condition>

</RDB_node>

<element_node name="CURRENCY1">

<text_node>

<RDB_node>

<table name="FXTRADE"/>

<column name="CURRENCY1" type="CHAR(3)"/>

</RDB_node>

</text_node>

</element_node>

<element_node name="CURRENCY2">

<text_node>

<RDB_node>

<table name="FXTRADE"/>

<column name="CURRENCY2" type="CHAR(3)"/>

</RDB_node>

</text_node>

</element_node>

<element_node name="AMOUNT">

<text_node>

<RDB_node>

<table name="FXTRADE"/>

<column name="AMOUNT" type="DECIMAL(18,2)"/>

</RDB_node>

</text_node>

</element_node>

<element_node name="SETTLEMENT">

<text_node>

<RDB_node>

<table name="FXTRADE"/>

<column name="SETTLEMENT" type="DATE"/>

</RDB_node>

</text_node>

</element_node>

<element_node name="ACCOUNT">

<element_node name="BANKCODE">

<text_node>

<RDB_node>

<table name="ACCOUNT"/>

<column name="BANKCODE"

type="VARCHAR(100)"/>

</RDB_node>

</text_node>

</element_node>

<element_node name="BANKACCT">

<text_node>

<RDB_node>

<table name="ACCOUNT"/>

<column name="BANKACCT"

type="VARCHAR(100)"/>

</RDB_node>

</text_node>

</element_node>

</element_node> <!--end of  Account element-->

</element_node>    <!-- end of  FxTrade element -->

</root_node>

</Xcollection>

</DAD>

DAD通过element_node(元素结点) 到RDB_node(关系数据库结点)的关联定义了XML元素和关系数据库列之间的映象。顶层的元素结点FXTRADE 作为表FXTRADE 和       ACCOUNT之间的一个关联被定义。ACCOUNT拥有一个ID列作为主键。子元素 CURRENCY1映射为表FXTADEK 表中的字段CURRENCY1,其它的类似。

Microsoft SQL Server 2000

SQL到XML的映射

SQL Server的双向映射规则均应用了不同的语法,下面将会讲述相关的细节。

从数据库中提取XML文档

数据库列和XML元素或属性之间的映射是用SELECT语句中的AS别名来定义的:

<database column> AS [Element Name! Nesting Level! Attribute Name! Directive]

文档的最顶层被指定为一级,如下面所示。默认的,列均被映射成为属性,指示“element”可以改变默认的设置。

从数据库数据产生XML文档的处理过程分两步:

1.         为输出XML文档的元子元素创建AS-aliases。别名定义了元素间的父子关系,下面是为我们的样例文档定义的别名:

FXTRADE       /* LEVEL=1 */

CURRENCY1   [FXTRADE!1!CURRENCY1]

CURRENCY2   [FXTRADE!1!CURRENCY2]

AMOUNT      [FXTRADE!1!AMOUNT]

SETTLEMENT  [FXTRADE!1!SETTLEMENT]

ACCOUNT   /* LEVEL=2  */

BANKCODE     [ACCOUNT!2!BANKCODE]

BANKACCT     [ACCOUNT!2!BANKACCT]

2.         在SQL中定义输出树的结构,树的每一层均用一个SQL语句来定义,然后通过UNION联合所有的SQL语句来整合树中所有的层。Level-1 SELECT语句先定义了其它层上所有原子元素的名字,每个SELECT语句都有一层标记和它的父标记,对应于对树的根,在结果集中有一条记录,如下第一条SELECT语句:

SELECT

1          AS    Tag,

NULL       AS    Parent,

NULL       AS    [FXTRADE!1!CURRENCY1],

NULL       AS    [FXTRADE!1!CURRENCY2],

NULL       AS    [FXTRADE!1!AMOUNT],

NULL       AS    [FXTRADE!1!SETTLEMENT],

NULL       AS    [ACCOUNT!2!BANKCODE],

NULL       AS    [ACCOUNT!2!BANKACCT]

FROM

FXTRADE

UNION ALL

SELECT

2,

1,

FXTRADE.CURRENCY1,

FXTRADE.CURRENCY2,

FXTRADE.AMOUNT,

FXTRADE.SETTLEMENT,

ACCOUNT.BANKCODE,

ACCOUNT.BANKACCT

FROM

FXTRADE,    ACCOUNT

WHERE

FXTRADE.ACCOUNT = ACCOUNT.ID

ORDER    BY    [ACCOUNT!2!BANKCODE],

[ACCOUNT!2!BANKACCT]

FOR    XML    EXPLICIT, ELEMENTS

FOR XML通过分析标记和在行集的AS别名来构造XML文档,关键字EXPLICIT选择更有弹性的用户自定义模式来构造XML文档,而AUTO模式则根据默认的规则来构造XML文档。关键字ELEMENTS把SQL的中的列模拟为元素,否则,默认是把列模拟为属性。

用数据库存储XML

用OPENXML来存储XML文档,一个行集的新功能,类似于表或视图,OPENXML可用于插入或更新,或作为SELECT INTO 的目标表,其简单语法如下:

OPENXML    (<XML document handler>, <path pattern>, <flags>)

WITH     (Schema | Table)

存储XML文档的过程分以下三步:

1.  通用解析XML文档为DOM获得其句柄,这可以使用存储过程sp_xml_preparedocument。

2.  通过关联模式中的字段和原子元素来创建模式。

XML元素的定义是通过一个路径模式(绝对基路径)加上一个相对元素路径。以元素为中心的映射用标专值2来指明。现存的表可用于替代模式,字段名和XML名字对应。]

3.  用存储过程sq_xml_removedocument把解析过的XML文档从内存中移除。

下面是一个例子:

DECLARE @idoc int

DECLARE @doc varchar(1000)

SET @doc ='

<FXTRADE>

<CURRENCY1>GBP</CURRENCY1>

<CURRENCY2>JPY</CURRENCY2>

<AMOUNT>10000</AMOUNT>

<SETTLEMENT>20010325</SETTLEMENT>

<ACCOUNT>

<BANKCODE>812</BANKCODE>

<BANKACCT>00365888</BANKACCT>

</ACCOUNT>

</FXTRADE>'

-- Create internal DOM representation of the XML document.

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Execute a SELECT statement using OPENXML row set provider.

SELECT *

FROM OPENXML (@idoc, '/FXTRADE/ACCOUNT', 2)

WITH (

CURRENCY1     CHAR (3),       '../@CURRENCY1',

CURRENCY2     CHAR (3),       '../@CURRENCY2',

AMOUNT        NUMERIC (18,2), '../@AMOUNT',

SETTLEMENT    DATETIME,       '../@SETTLEMENT',

BANKCODE      VARCHAR (100),  '@BANKCODE',

BANKACCT      VARCHAR (100),  '@BANKACCT' )

EXEC sp_xml_removedocument @idoc

总结

用Microsoft SQL Server 2000,提取和存储XML文档并不是用对称的语法,提取用的是扩展SELECT子句FOR XML。存储XML则是引进了行集功能OPENXML,类似于表或视图,提取映射规则是基于:A)为特定的树层次引进标记,B)为表中的字段和XML文档元素的父子关系建立关联。存储XML是把XML文档重建为简单的模式或表,“字段-元素”关联是用XPATH表达式来定义的。

SYSBASE ADAPTIVE SERVER

SQL to XML映射

SYBASE 利用一个XML文档类型ResultSet来描述XML文档的元数据(如元素名,类型,大小等)和实际的行数据,下面是假想FxTradeSet.xml文档的摘录:

<?xml version="1.0"?>

<!DOCTYPE ResultSet SYSTEM "ResultSet.dtd">

<ResultSet>

<ResultSetMetaData>

<ColumnMetaData

...

getColumnLabel="CURRENCY1"

getColumnName="CURRENCY1"

getColumnType="12"

... />

...

</ResultSetMetaData>

<ResultSetData>

<Row>

<Column name="CURRENCY1">GBP</Column>

...

</Row>

</ResultSetData>

</ResultSet>

ResultSet的DTD不允许对嵌套元素的定义。

从数据库中抽取XML

JAVA类ResultSetXml有一个构造函数,它以一个SQL查询作为参数,然后getXmlLText方法从结果集中抽取XML文档:

jcs.xml.resultset.ResultSetXml     rsx = new jcs.xml.resultset.ResultSetXml

("Select * from FxTrade", <other parameters>);

FileUtil.string2File ("FxTradeSet.xml", rsx.getXmlText());

用数据库存储XML

JAVA类ResultSetXml也可以用XML文档作为其构造函数据的参数,然后toSqlScript方法会产生一个序列的SQL语句来对特定的表进行插入或更新操作。

String    xmlString = FileUtil.file2string ("FxTradeSet.xml");

jcs.xml.resultset.ResultSetXml     rsx = new jcs.xml.resultset.ResultSetXml

(xmlString);

String     sqlString  = rsx.toSqlScript ("FxTrade", <other parameters>)

总结

在这里,抽取和存储XML文档本质上是对称的,存储不允许修改一个以上的表,抽取则把一个SQL查询的结果转换成一个简单结构的文档。

各供应商的对比:

供应商

映射规则

单表/多表

转换方法

对称抽取/存储

Oracle

在构造关系对象数据

模型中指明

多表

有相应的JAVA类

如果XML文档和关系

对象模型匹配的话是对称的

IBM

DAD(数据访问定义文件

多表

内置的存储过程

对称

Microsoft

SQL扩展,行集功能

抽取是多表,存储是单表

用SQL语句

FOR XML和行集OPENXML

不对称

Sysbase

结果集的DTD

单表,但查询可以包含多表

相应的JAVA类

对称

供应商共同的特点:

1.  XML的持续化都有一个特定的原则,也就是说,对任意的XML文档存储并没有普便的方法。

2.  存储时均需要对XML文档进行预处理,比如把数字/日期变换成本地格式等,XSLT可以用于这种处理过程。

Storing XML in Relational Databases(2)相关推荐

  1. An annotation management system for relational databases(论文阅读)

    目录 关系数据库注释管理系统 论文背景 关键词 简介 结果总结 相关工作 三个蛋白质数据库,一个映射表和三个pSQL查询的结果 自定义传播方案 注释管理系统 本地存储方案 性能比较 关系数据库注释管理 ...

  2. 【分布式】论文《Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases》

    参考 来自 https://www.cnblogs.com/zzk0/p/13425353.html 来自 https://www.cnblogs.com/brianleelxt/p/13332312 ...

  3. Document-oriented database(文档数据库)

    前言: 关系型数据库已经红火了很久,但是其弊端也是显而易见的,对于很多非结构数据以及半结构化数据很难有效地管理,而且RDBMS的固定式的Schema往往很难接受,太呆板不灵活,因此基于可自由伸缩的sc ...

  4. Succeeding with Object databases: a practical look at today's implementations with Java and XML

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任. http://blog.csdn.net/topmvp - topmvp Take a ...

  5. NoSQL Databases - MongoDB

    MongoDB被称为最象RDBMS的NoSQL, 确实是, 因为跟RDBMS相比, 它最大的改动其实就是在数据模型上有所不同. 其次就是MongoDB不支持事务, MongoDB只支持单文件的原子性修 ...

  6. 如果有人问你关系数据库的工作原理,叫他看这篇文章How does a relational database work

    When it comes to relational databases, I can't help thinking that something is missing. They're used ...

  7. How does a relational database work

    How does a relational database work NOSQL跟SQL一样,在内存中都是用hash table,都是key-value 只不多nosql几乎无锁,无事务,速度更快, ...

  8. Coursera课程Python for everyone:Quiz: Multi-Table Relational SQL

    Multi-Table Relational SQL 10 试题 1. What is the primary added value of relational databases over fla ...

  9. NoSQL Databases - CouchDB

    CouchDB还是蛮有意思的一个DB, 总结一下, 他重要的特点 1. 最大的特点就是他的file layout and commitment system, 并由此可以保证ACID特性, 在Nosq ...

最新文章

  1. ListView中CheckBox使用问题
  2. 电商那些年,我摸爬打滚出的高并发架构实战精髓
  3. 纯靠技术,很难进入大厂了。。。
  4. dotnet core 开发无缝兼容Http和Websocket协议的接口服务
  5. Andorid之网络通信框架Volley使用和总结
  6. FD.io VPP利用iperf3进行UDP灌包测试-英特尔X520万兆网卡
  7. uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)
  8. LeetCode 30. Substring with Concatenation of All Words
  9. List 去除重复数据的 5 种正确姿势!
  10. 求数组的子数组之和的最大值III(循环数组)
  11. wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方式
  12. CreateFile和WriteFile
  13. java反射机制面试_java反射机制面试题及答案整理,java反射面试题
  14. 论文阅读 (70):Exploring Self-attention for Image Recognition
  15. h5页面 请在微信客户端打开链接_使用Fiddler抓包解决“请在微信客户端打开链接”的问题...
  16. 【深度学习】(1) CNN中的注意力机制(SE、ECA、CBAM),附Pytorch完整代码
  17. spring boot + netty实现匿名聊天室 web版
  18. 谈谈数据挖掘和机器学习
  19. 免费数据库及常用统计网址-数学建模(二十)
  20. 小米路由器进入linux系统,小米路由器操作系统竟不是miui

热门文章

  1. matlabrobert锐化_Matlab图像处理—锐化滤波器
  2. 百练OJ:2965:玛雅历
  3. 笔记-项目管理ITTO-高项/PMP第五版-全
  4. centos7 yum源安装ruby27方法
  5. 消息队列-RabbitMq(PHP)
  6. Chrome浏览器Json查看插件JsonHandle下载以及无法安装插件的解决方法
  7. import javax.servlet.http.HttpServletRequest 提示错误
  8. 安装Scrapy时:Microsoft Visual C++ 9.0 is required
  9. 软考-信息系统项目管理师-项目管理成熟度模型
  10. springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA