浅析XML文档和关系数据库之间的信息交换

(整期优先)网络出版时间:2010-04-14
/ 3

浅析XML文档和关系数据库之间的信息交换

唐晔

唐晔

(遵义师范学院计算机科学系,贵州遵义563002)

中图分类号:U284.67+3文献标识码:A文章编号:1007-9599(2010)04-0000-02

摘要:针对当前关系数据库广泛应用的事实,研究了XML文档和关系数据库之间数据的双向转换,并讨论了如何把XML查询表达式转换为SQL查询的问题。

关键词:可扩展标记语言;关系型数据库;XML查询语言

SimpleAnalysisonTransformationBetweenXMLDocumentsandRelationalDatabases

TangYe

(ZunyiNormalCollege,ComputerScienceDepartment,Zunyi563002,China)

Abstract:Duetothepopularityofrelationaldatabases,westudythebi-waytransformationbetweentheXMLdocumentsandrelationaldatabases.Furthermore,discussthewayoftransformingXMLqueryexpressionintoSQLquery.

Keywords:XML;RelationalDatabases;XML-QL

一、XML与数据库的异同

XML使用XML文档提供数据存储,采用DTD或XMLSchema来描述数据的逻辑结构,用XQL、XML-QL、QUILT等查询语言作为直接操作XML文档中数据的工具,能够对数据进行直接存取访问,采用SAX(SimpleAPIforXML)和DOM提供了应用程序的编程接口。这样在数据量一般、用户较少、性能要求不高的环境下可以把XML当作数据库来使用。用XML存储数据的优势在于它的开放性好,XML独立于厂商可以跨平台运行,允许不同来源的数据无缝集成,从数据描述的角度看,XML灵活、可扩展,结构与显示是分离的,并且可以直接支持Web应用。

不过,XML还缺少很多在真实的数据库中所必备的内容。在要求有多用户使用、需要严格的数据完整性并且对性能有很高的要求的情况下,数据库的优势就很明显了。DBMS具有分阶段事务提交、加锁等自动的并发访问机制,它的索引功能可以极大地提高数据查询的速度,有灵活和安全的用户权限管理功能,并且在数据完备性、多用户访问、触发、多文档查询等方面有强大的机制。

当然,我们不排除在将来XML文档能够拥有数据库的一切优良特性,甚至数据库本身就是用XML来实现,但在目前的情况下,关系数据库还在商业应用中占主导的地位,在这样的背景下研究XML与数据库之间的相互转化,特别是与关系数据库之间的转换就显得特别重要。

二、转换原理

由于XML是层次结构的,它可以对非关系型的数据进行编码。但是,目前服务器上维护的数据来自关系型数据库,因此我们首先讨论如何使关系型数据和XML结构相配。[1]

关系数据库的基本组成单位是表,这里定义一个映射实现表和XML数据文档之间的转换。假设一个表:TABLE(A1,A2,…,An),其中An表示表格中的第n个字段名,可以用下列算法转变为一个XML文件。

1.将整个表格表示成为<table></table>标记块,以后的所有操作内容都放在这两个标记之间。

2.将表格的第一行表示成为<line></line>标记块,并且在该行中的每一列,以列的字段名作标记名,依次表示为标记组合。

3.对表格中的其他行重复上一步的做法,直到表中最后一行数据。

转换后的结果如下图所示:

<?xmlversion=1.0?>

<table>

<line>

<A1>X11</A1>

<A2>X21</A2>

……

<An>Xn1</An>

</line>……<line>

<A1>X1m</A1>

<A2>X2m</A2>

……

<An>Xnm</An>

</line>

</table>

我们可以建立数据库模式(databaseschema)和XML数据模式(xmlschema)之间的映射关系,实现信息的转化。

从数据库的数据模式到XML数据模式的转化规则是:[2,3]

(1)为每一个表创建一个元素。

(2)为表中的每一个字段创建一个属性或只能是PCDATA(可解析字符串)的子元素,子元素或者属性的类型尽量与表中的字段数据类型一致,若字段在表中允许为空,则该字段对应的属性或者元素也应该允许空。

(3)对每一个主键和外键关联,将外键所在的表创建的元素作为子元素插入主键所在的表所对应的元素中。

从XML数据模式到数据库的数据模式可以用如下的方式建立:

(1)为每一个有子元素或者混合内容的元素建立一个表,该表具有一个关键字。

(2)为每一个混合元素建立一个独立的表,该表通过父元素表中的关键字建立关联。

(3)为每一个元素的单值属性和每一个只能是PCDATA的一次出现的子元素创建一个字段,如果该子元素或者该属性在XML中允许为空,则相应的在数据库中,该字段允许为空,如果属性或者元素不能为空,则该字段不能为空。

(4)为每一个元素的多值的属性或者能在文档中多次出现但类型是PCDATA的子元素创建独立的表,该表与父表通过父表的关键字关联。

这样的转换比较完整地将原来存在于XML文档中的结构映射到了数据库中,接下来的要做的只是将该DTD对应的文档的内容导到数据库中即可,这种导入是非常简单的。

需要注意的是当XML文档不是由数据库中导出,而是由应用程序来指定XML文档的数据结构时,从XML数据模式映射到数据库模式时存在一些问题:首先是映射到表的时候需要将字段的数据类型设定,DTD文档无法准确定义元素的数据类型,在引入schema之后可以解决此问题;[4]其次在XML文档中,大小写是区分的,而在数据库中大小写是不区分的,假如在XML文档中存在两个PCDATA的元素,它们的名称除了大小写不同外都一样,则转换程序会将其转换成两个字段,这会导致在数据库中错误的发生;另外XML数据是有顺序的,而数据库中的数据是无序结构表达的,办法之一是添加一个sort字段。

三、基于SQL的XML的查询的实现

(一)XML查询语言

用户对所感兴趣的数据通常有一个查询产生,而查询中最关键的部分是查询的条件表达式。基于这种观点,SELECT,DELETE,UPDATE等操作的关键都是找到用户感兴趣的数据,并进行相应的操作,利用关系数据库来查询处理XML数据就成为需要解决的问题。[5]

研究者已提出了各种XML查询语言,如Lorel[20],XML-QL,XQL等,一个Lorel查询的例子如下:

SELECTx.authorFROMproject.publication.xWHEREx.titleLIKELorel%

首先我们消除Lorel查询中的变量成分,根据Lorel查询的语义,同一正则路径前缀绑定相同的路径实例。一个变量可以用其对应的表达式前缀替换。上例消去变量后表示如下:

SELECTproject.publication.authorWHEREproject.publication.titleLIKELorel%

XML查询语言的基本特点是正则路径表达式一个正则路径表达式的定义如下:

R=(R1.R2)|(R1|R2)|R*|R+|R?|#|NAME|ε

其中R1.R2表示从R1到R2的路径,R1|R2表示选择关系,R*、R+和R?分别表示R的0或多、1或多、0或1次重复,#表示任意路径,NAME表示结点标记,ε表示空路径。

与正则路径表达式RPE相对应,仅由结点标记构成的路径称为简单路径表达式(SPE),将仅含简单路径表达式的查询成为简单路径查询。

(二)重写RPE查询为SPE查询

重写RPE查询为SPE查询的重点在于消去RPE查询中的正则操作符。

消除查询表达式中出现的#。一般地,正则表达式E1#E2匹配从E1开始,经一条或多条边到达E2的所有路径。消除#需遍历整个映射图,将映射图中以E1为起点,E2为终点的子图转化为与之等价的正则表达式。将一个图转化为正则表达式的问题是一个已知问题,采用适当的算法我们可以将表达式中的#部分转化为与之匹配的映射子图对应的正则表达式,从而消除#。

消除*和+操作符。可以通过在模式层(即DTD图和映射图层)保存数据图中环的路径实例的统计信息来消除*,类似地也可以消除+操作符。

消除|。若表达式S1|S2|…|Sn出现于查询的SELECT子句中,则算法将其重写为n个查询语句Q1,Q2,…,Qn的并。

消除?。一个表达式P?可以重写为P|ε。

(三)重写SPE查询为SQL查询

给定一个SPE查询,SPE-SQL算法[6]将其中的每个简单路径表达式S1,S2,…,Sn与DTD映射图中的路径进行匹配,假定该路径在XML-关系映射下对应K个关系R1,R2,…,Rn,这K个关系将S1,S2,…,Sn划分成K段相连路径P1,P2,…,Pn,其中路径段Pi(0<i<k+1)落入关系Ri中。在存储映射时,关系Ri中Nid和Pid属性分别记录了Pi中的头结点标识和头结点的父结点标识。任两个相连的路段Pi和Pi+1可用如下的关联条件实现:若Pi和Pi+1通过结点间的嵌套边相连,则将其重写为Ri.Nid=Ri+1.Pid。这样将关系R1,R2,…,Rn加入查询的FROM子句,关系间的关联条件加入WHERE子句,一个SPE查询可以重写为一个SQL查询。举例说明:考虑如下映射图和SPE查询:

SELECTproject.publication.author

遍历映射图,查询被重写为如下的SQL语句:

SELECTauthor

FROMproject,publication

WHEREproject.Nid=publication.Pidandpublication.Nid=author.Pid

将XML查询转换为关系系统中的查询过程为:首先将XML查询中的变量消去,把正则路径表达式重写为简单路径表达式,再将SPE表达式的查询转化为SQL查询。

参考文献:

[1]RonaldB,XMLandDatabases,http://www.rpbourret.com/xmldbms

[2]GoldmanR,McHughJ,WidomJ,FromSemistructureddatatoXML,Procofthe2ndWorkshoponWebandDatabases,1999,2:25-30

[3]张素智,卢正鼎,李春林.XML数据库及其应用研究计算机工程与应用,2002,l,8:32-35

[4]WidomJ,DataManagementforXML:ResearchDirections,http://www-db.stanford.edu/widom

[5]刘芳珠,潘亦,潘金贵.基于3层网络架构及DOM的XML系统模型,小型微型计算机系统,2001,l,12:1512-1515

[6]MaryF,WangC,DanS,Silkroute-tradingbetweenrelationandXML,ComputerNetworks,2000,33:723-745

作者简介:

唐晔(1973-),男,讲师,主要从事计算机网络方向的研究。

资金项目号:遵市科合社字(2007)27号