1. 引言
多年来,在信息化建设的进程中,由于人们对信息共享认识上的不足,造成各个应用系统之间的数据信息难以共享,形成彼此隔离的“信息孤岛”,极大地阻碍了信息化进程。如何共享已有的数据信息,已成为当今数据库研究领域的热点问题 [1] 。
为解决这一问题,许多研究者先后提出了多种不同的用于解决数据共享问题的数据集成技术。总的来讲,异构数据库集成所采用的技术有三种 [2] :数据库迁移和转换技术、多数据库系统技术及使用中间件技术。这三种方法各有优缺点,一些研究者对第一种技术进行了研究,并开发了相应的程序,但其适用范围受到数据库系统版本及操作系统版本等因素的限制。到目前为止,还没有商品化的多数据库系统,即使在CIMS(Computer Integrated Manufacturing Systems,计算机集成制造系统)环境中实施也有一定的难度;而大多数研究者倾向于使用中间件技术来完成数据的集成。
为了完成数据的交换,需要采用统一的标准和规范,生成一个可供异构数据库之间共享数据的数据源。如今,XML(eXtensible Markup Language,可扩展标记语言)逐渐成为Internet上数据交换的标准模式 [3] ,同时,XML的诸多优点使得采用XML做为中间数据模型来完成数据的跨平台交换 [4] 得到了广泛的研究。采用这种模型的关键点在于数据库的关系模式向XML模式转换的映射问题。关系模式映射为XML模式的主要方法有模板驱动映射和模型驱动映射,国内外的许多学者针对这两种方法做了研究和实现。哈尔滨工程大学的曹虎 [5] 提出了基于XML中间件的异构数据库集成的中间件技术,以此来完成异构数据库数据的整合集成。山东大学的綦娜娜 [6] 提出了以XML文档为异构数据交换中介,实现基于XML的数据交换平台。这些方法大都是基于DTD技术来保留、完善映射过程中的信息匹配问题,但由于DTD本身的局限性,它们在映射过程中都没有很好的解决语义丢失等问题。
本文通过对目前存在的关系模式向XML模式映射方法的分析研究,提出了采用XML做为中间模型,使用基于改进的表的模型驱动映射方法来完成模式的映射。主要特点是对基于表的模型驱动映射方法进行了改善,用XML Schema技术取代DTD技术,很好的解决了映射过程中的语义丢失等问题;其次,考虑到实际的应用存在着表插入的优先顺序问题,为方便数据的操作,提出了表插入优先级计算方法,以简化XML数据向关系数据库插入的工作,提高数据交换的效率。
2. 映射方法的选择
根据以往的一些学者们的研究,异构数据库的数据集成涉及的主要问题有:异构性(包括系统异构和数据异构)、完整性(包括数据完整性和约束完整性)、透明性(包括平台透明性、系统透明性、数据源透明性)、针对不同数据源访问时的权限控制等 [7] [8] 。正如上述引言中所说的那样,采用XML作为中间数据模型加上本文下面介绍的映射技术和方法很好的解决了这些问题。
常用的建立数据库与XML文档映射关系的方法主要有两种:模板驱动和模型驱动。
2.1. 模板驱动
模板驱动映射方法的特点是不预先定义文档结构和数据库结构之间的映射关系,而是将命令语句(如select查询语句)嵌入到XML模板中的指定位置,然后让数据传输的中间件执行该模板,获得执行结果并替换模板中对应的命令语句部分,从而得到所要的XML文档。
2.2. 模型驱动
模型是对事物的一种抽象 [9] ,模型驱动就是对系统相关数据进行的抽象描述和规范的说明 [10] 。模型驱动映射方法的原理是在整个映射过程中以定义的模型为中心,把模型语义定义为映射约束条件,来驱动完成数据的映射 [9] 。采用基于XML的模型驱动映射的显著优点是简单易用,这是因为它在映射转换前先定义数据库模式与XML文档模式之间的映射关系,然后以此映射关系来完成数据库到XML文档之间的映射转换。通常这种模型驱动映射通过提前定义好的语义完成了需在映射过程中做的很多工作,极大简化了异构数据库的整合工作。
模型驱动的映射有基于表的映射(Table Based Mapping)和基于对象关系型的映射(Object Relational Mapping) [3] [6] 两种实现方法。这两种方法都是为数据建模,非常适合以数据为中心的映射过程,因而比较广泛地运用在实现数据库与XML文档之间的数据转换,特别是在关系数据库与XML之间的数据转换中。更重要的一点是这两种方法都能实现数据库与XML文档的双向转换。现在,这两种映射方法已经逐渐成为映射规范,通过它们来定义XML视图,XML查询语言(比如,XQuery可以直接通过视图对非XML数据库进行查询)。
对象关系映射功能比较强大,能够表示复杂的数据库模式,但映射规则复杂,转换效率较低。
基于表的映射则比较简单明了,但转换出来的XML文档格式比较单一,不能表示过于复杂的数据库模式,主要问题表现在:
1. 数据转换过程中的类型保留问题;
2. 数据格式的验证问题;
3. 表中约束条件信息的保留问题;
4. 表间相互参照约束信息的保留问题;
5. 从XML中提取数据向数据库中插入时的先后顺序问题。
为了解决基于表的映射中存在的问题,又有研究者提出了把基于表的映射和DTD (Document Type Definition,文档类型定义)相结合 [6] ,但由于DTD的语法结构独特 [11] [12] ,并且在约束和类型表达方面具有一定的缺陷,因而没有完全解决上述问题。
XML数据结构的另一种表示方式XML Schema具有丰富而强大的数据类型、基于命名空间的有效性验证以及可扩展、可伸缩等优点,加上XML Schema中定义的空值、唯一及键的概念与关系数据库中的概念是相符的,并且用XML Schema语言描述的XML Schema文档仍然是标准的XML文档,可以用解析XML文档的方法来解析XML Schema,所以利用基于表的映射方法的简单、易用、高效的优点作为关系数据库向XML的映射方法,同时采用XML Schema丰富强大的内建数据类型等优点来克服基于表的映射方法在表述关系数据库物理结构等方面的不足,将基于表的映射方法与XMLSchema结合,由此产生的改进的基于表的映射方法将能很好的克服传统的基于表的映射方法存在的问题。
3. 映射模型的提出
完成了异构数据库中的数据提取之后,为了满足用户的需求,要对其实现模式转换,即从关系模式映射成XML Schema或者从XML Schema映射成关系模式,才能使得异构数据在互联网上实现彼此通信和共享 [13] 。
将关系模式映射为XML Schema模式其本质就是用Schema来记录关系数据库中的表参照关系、字段类型信息以及表中或者表间的约束关系等信息。
以往的基于表的映射技术采用的是DTD辅助完成数据结构映射,为了能够在DTD中对类型进行表述,一种解决办法就是使用参数实体,在DTD内部的参数实体中对#PCDATA的类型进行声明。例如:
参数实体声明
参数实体声明
实体引用表明元素money类型为integer
实体引用表明元素mount类型为float
而XMLSchema模式语言却拥有很多内建的数据类型,针对同样的问题,XML Schema的声明如下:
从以上的比较可以看出,采用DTD对XML进行约束存在着语法复杂等缺陷。本文借鉴以往的映射技术,通过对Schema的学习和研究,提出了从关系数据库(RDB)到XML Schema的映射模型RTXS(RDB to XML Schema模型,简称RTXS)。
首先,将数据库中的表T = (T1,T2,…,Tn)(n为数据库中表的个数)按照有相互参照关系的分为一个组,得到组G1,…,Gm(1 ≤ m ≤ n),其中Gi = (Ti1,Ti2,…,Tis)(1 ≤ i ≤ m,1 ≤ i1,…,is ≤ n)。并将每一组中的表映射到一个Schema文件中,确保有相互参照关系的表在同一Schema文件中,以便对于XML文件进行参照方面的检验和XML数据向关系数据库数据转换时能够集中处理,提高效率。
然后,处理每一组中的表,将每一表的字段都映射到Schema中。具体过程如下:
第一步,将Schema中的根节点定义为
;
第二步,根节点
下定义为各个表
节点,每个表节点的名称定义时取表名称为节点名称,这些节点相互不影响;Schema中定义节点的语法为 [14] :
经过上述两个步骤,基本确定了Schema规范下的XML文档中的节点树,如图1所示:
第三步,将具体字段类型进行匹配映射,Schema中定义元素类型的语法如下 [15] :
第四步,各种约束等的映射。这一步是关键的映射,也是Schema区别于DTD最主要的地方。具体如下 [16] - [18] :
①定义主键(Primary Key):
②主键参照(键引用) (Key Reference):
③默认值(Default Value)、固定值(Fixed Value)约束定义:
④对于数据库中用户自定义的check约束,当约束数据的大小范围时,映射到Schema中如下:
⑤当约束为字符串的长度时,可以通过在Schema中使用 length、maxLength 以及 minLength 限定来进行映射约束:
至此,就完成了关系模式到XML Schema模式的映射。
完成了模式映射之后的Schema文件:
1. 可以对XML进行验证;
2. 当提取XML数据向数据库插入数据的时候,对于数据类型的转换映射起到标准参照的作用;
3. 除了对XML的规范,还使得XML中数据的意义表述出来,便于XML数据的网络发布应用和信息共享。
4. XML文件的生成
完成了模式的映射之后,接下来的工作是将数据库中的数据根据基于表的映射方法映射生成XML文件。
在表映射到XML中时根节点是
,根节点
下是
Figure 1. XML document tree structure diagram
图1. XML文档树形结构图
Priority Compute,简称TIPC)。算法描述如下:
①初始情况下,将各个表的优先级都置为1,设置各个表的访问标志为FALSE,并定义P(A)表示A表的优先级;
②遍历所有的表,设当前访问的表为A表,若A表无参照表,继续执行步骤②;若A表参照了B表,顺序执行以下步骤(有几个参照表执行下列步骤几次):
i比较A、B表的优先级,
若P(A) < P(B),执行步骤ii;
若P(A) ≥ P(B),将B的优先级置为A表优先级加1,即P(B) = P(A) + 1;
若B的访问标志为TRUE(表示B已经访问过),访问B表,执行步骤②;
若B的访问标志为FALSE(表示B还没有访问过),执行步骤ii;
ii设A表的下一个参照表为B,执行步骤i;若A表无其它参照表,置A表的访问标志位TRUE,执行步骤③;
③判断是否所有表都已遍历,若还有表没有遍历,继续执行步骤②,否则,执行步骤④;
④结束。
整个算法可用如图2所示的框图表述。
TIPC算法就是在具有参照关系的表之间建立一个被参照的表优先级大于参照表的优先级,然后按照优先级从大到小的顺序提取各表中的数据生成XML文件,以保证当把XML文件中的数据插入目的数据库的表中时,不会发生参照约束错误。
5. 实验及结果
选择Oracle 11g为源数据库,MS SQL Server 2012为目标数据库,采用JDBC技术访问数据库,使用DOM解析器来完成对XML文件的解析与生成。通过中间件技术及相应的应用程序完成对数据库的访问操作以及对XML文件的操作。
实验所采用的数据库结构如图3所示。
数据库模式向XML模式映射的过程如下:
首先,从数据库中提取相应的信息,按照本文提出的映射规则生成描述表结构信息的Schema文件,如图4所示。
第二步,根据数据库中的表格参照关系利用TIPC算法计算表数据的插入先后顺序。
利用TIPC算法可得各表的插入优先级为P(vip) = 3,P(incomeshare) = 3,P(role) = 3,P(rightsmanage) = 3,P(except_c_o) = 3,P(exceptstate) = 3,P(goodssort) = 3,P(goodsl_stat) = 3,P(truck_stat) = 3,P(range) = 3,P(gl_distance) = 3,P(user1) = 2,P(relationship_5) = 2,P(truckinfo) = 2,P(con_ordsheet) = 2,P(station) = 2,P(relationship_7) = 1,P(ordersheet) = 1,P(distance) = 1。
第三步,按照基于表的映射规则以及上述计算的表提取优先顺序将关系数据库数据提取出来生成XML数据文件,XML数据文件(部分)如图5所示。
数据交换过程中,最主要问题包括数据类型、数据本身映射的准确性,以及映射效率。由于XML Schema所提供的数据类型远多于DTD所能提供的数据类型,所以在数据类型、数据本身映射的准确性上,本文所提出的RTXS模型的优点是明显的。为了比较两者的映射效率,针对DTD进行了同样的试验,结果发现利用RTXS模型完成本例表结构以及所用全部数据库数据,从源数据库到目标数据库迁移的时
Figure 2. Block diagram of TIPC algorithm
图2. TIPC算法框图
Figure 3. Database structure used in experiment
图3. 试验所用数据库结构
间为2.112秒,而采用传统的基于表的映射方法则需要3.814秒。
由此可以证实RTXS模型,无论是在交换效率,还是在保证数据类型、语义信息的完整性方面等都优于原来的基于标的映射模型。
6. 结论
本文针对以往数据交换时数据映射方面存在效率不高、数据类型丢失,以及语义信息不完整等问题,通过把基于表的模型驱动映射方法与XML Schema相结合的思想,提出了改进的基于表的映射方法。试
Figure 4. Describes the table structure information of the Schema file (part)
图4. 描述表结构信息的Schema文件(部分)
Figure 5. Describes the XML file for the database data (part)
图5. 描述数据库数据的XML文件(部分)
验研究证明这一方法很好地实现了数据从数据库到XML的映射,与以往的方法相比较,数据安全、交换效率都得到了提高,为异构关系数据库系统实现数据交换提供了新的解决方案。
基金项目
山西省2013年科技攻关项目(20130321007-02)。