Storing XML in Relational Databases(2)
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)相关推荐
- An annotation management system for relational databases(论文阅读)
目录 关系数据库注释管理系统 论文背景 关键词 简介 结果总结 相关工作 三个蛋白质数据库,一个映射表和三个pSQL查询的结果 自定义传播方案 注释管理系统 本地存储方案 性能比较 关系数据库注释管理 ...
- 【分布式】论文《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 ...
- Document-oriented database(文档数据库)
前言: 关系型数据库已经红火了很久,但是其弊端也是显而易见的,对于很多非结构数据以及半结构化数据很难有效地管理,而且RDBMS的固定式的Schema往往很难接受,太呆板不灵活,因此基于可自由伸缩的sc ...
- Succeeding with Object databases: a practical look at today's implementations with Java and XML
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任. http://blog.csdn.net/topmvp - topmvp Take a ...
- NoSQL Databases - MongoDB
MongoDB被称为最象RDBMS的NoSQL, 确实是, 因为跟RDBMS相比, 它最大的改动其实就是在数据模型上有所不同. 其次就是MongoDB不支持事务, MongoDB只支持单文件的原子性修 ...
- 如果有人问你关系数据库的工作原理,叫他看这篇文章How does a relational database work
When it comes to relational databases, I can't help thinking that something is missing. They're used ...
- How does a relational database work
How does a relational database work NOSQL跟SQL一样,在内存中都是用hash table,都是key-value 只不多nosql几乎无锁,无事务,速度更快, ...
- 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 ...
- NoSQL Databases - CouchDB
CouchDB还是蛮有意思的一个DB, 总结一下, 他重要的特点 1. 最大的特点就是他的file layout and commitment system, 并由此可以保证ACID特性, 在Nosq ...
最新文章
- ListView中CheckBox使用问题
- 电商那些年,我摸爬打滚出的高并发架构实战精髓
- 纯靠技术,很难进入大厂了。。。
- dotnet core 开发无缝兼容Http和Websocket协议的接口服务
- Andorid之网络通信框架Volley使用和总结
- FD.io VPP利用iperf3进行UDP灌包测试-英特尔X520万兆网卡
- uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)
- LeetCode 30. Substring with Concatenation of All Words
- List 去除重复数据的 5 种正确姿势!
- 求数组的子数组之和的最大值III(循环数组)
- wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方式
- CreateFile和WriteFile
- java反射机制面试_java反射机制面试题及答案整理,java反射面试题
- 论文阅读 (70):Exploring Self-attention for Image Recognition
- h5页面 请在微信客户端打开链接_使用Fiddler抓包解决“请在微信客户端打开链接”的问题...
- 【深度学习】(1) CNN中的注意力机制(SE、ECA、CBAM),附Pytorch完整代码
- spring boot + netty实现匿名聊天室 web版
- 谈谈数据挖掘和机器学习
- 免费数据库及常用统计网址-数学建模(二十)
- 小米路由器进入linux系统,小米路由器操作系统竟不是miui
热门文章
- matlabrobert锐化_Matlab图像处理—锐化滤波器
- 百练OJ:2965:玛雅历
- 笔记-项目管理ITTO-高项/PMP第五版-全
- centos7 yum源安装ruby27方法
- 消息队列-RabbitMq(PHP)
- Chrome浏览器Json查看插件JsonHandle下载以及无法安装插件的解决方法
- import javax.servlet.http.HttpServletRequest 提示错误
- 安装Scrapy时:Microsoft Visual C++ 9.0 is required
- 软考-信息系统项目管理师-项目管理成熟度模型
- springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA