◎1引言 XML在Web领域已经得到了广泛...... 1引言 XML在Web领域已经得到了广泛的应用,而XML数据库一直是个研究热点。各数据库厂商及研究机构纷纷投入对XML技术的研究及开发。大体上可以把XML数据库分为两类:原生XML数据库(Native XML Database)和使能XML数据库(Enable XML Database)。而XML数据一般可划分为粗粒度、中粒度及细粒度三种形式。以文档为中心的粗粒度形式,一般采用原生XML数据库,而以数据为中心的细粒度形式一般采用使能XML数据库。 XML数据是嵌套的树形结构,而关系数据库是简单、平面的二维表结构,结构的差异性,使得在存储XML数据时需要按一定的映射规则进行转换,并使能够恢复到原XML文件。 2 商用数据库对XML的支持 目前各著名数据库厂商比如 IBM、Microsoft、Oracle 和 Sybase 都宣称能够支持XML技术。研究分析,它们都是基于各自的数据库之上,没有一定的通用性,而且在XML和SQL的转换中是不对称的。如表1是对各商用数据库的分析。 表1 各商用数据库一览表 数据库的映射及转换研究 src="http://www.ninedns.com/images/tech/images/A13515_IMG2007418_1.png" border=1> 这里主要说说SQL Server。在取XML数据时,它是通过扩展SELECT的FOR XML来实现的,它有三种模式: RAW、AUTO和EXPLICIT,其基本思想都是把查询的每个行记录作为一个元素返回被保存在每个标签中。在保存XML数据时,SQL Server是通过OPENXML来实现的,通过设定绝对或相对路径,把不同层次的数据放入一个表格中,不保存XML结构信息,无法完全恢复到原来的XML文件。 总体上,各种关系数据库都有各自的支持策略,但对开发人员来说,用到不同的数据库处理XML,程序上就要做出相当大的变化。因此一种独立通用的映射来保存XML数据是必要的。 3映射模型 XML文件物理结构上由多种元素组成,本文的研究只考虑常用的ELEMENT、TEXT、ATTRIBUTE三种元素,采用三个表来保存XML数据。主要思想是把树结构中的中间节点(非属性和文本节点)放入mNode(Middle Node)表,叶子节点(属性和文本节点)放入eNode(End Node)表,另外一个是ePath表,用于保存从根节点到叶子节点的路径。当然保存多个XML时,我们会引入一个用于保存区分各个XML的表。详细说明如下: 1) Path(pathID, path) 该表主要保存从根结点到各个叶子结点的所有不同的路径,在查询时可满足类似于Xpat的查询。 pathID:各不同的路径标识符,在解析过程中产生。 path:实际路径名称。 2)mNode(nodeID, nodeName, parentID, order, pathID) 该表主要通过指定parentID来保存各节点间的父子关系,以保持原XML的树型结构。 nodeID:节点的唯一标识符,在解析过程中产生。 nodeName:节点的名称,即XML中的实际名称。 parentID:父节点的标识符,根节点置为-1。 order:兄弟节点的先后次序。 pathID:从根结点到本节点所走的路径。 3)eNode(nodeName, nodeValue, parentID, order, type) 该表主要保存属性及文本节点的值。 nodeName:属性名,如果是文本节点则取其父节点名。 nodeValue:属性文本值。 parentID:父节点的标识符。 order:兄弟节点的先后次序。 type:用于区分属性还是文本的标量。 4转换方法 从XML到SQL,一般都是采用递归算法,先根遍历XML树结构,而从SQL返回到XML时,一般采用队列生成XML节点。递归过程一般要消耗较多的时间和空间,在处理较大结构的XML时,性能上不是很理想。 本模型在XML和SQL中放入一个中间层,该层中主要有根据DTD或Schema生成的一系列Bean、一个操作SQL的模块、一个操作XML的模块,另外在此基础上还可以方便扩展给其他业务逻辑层调用的模块。结构如下图所示: 数据库的映射及转换研究 src="http://www.ninedns.com/images/tech/images/A13515_IMG2007418_2.jpg" border=1> JavaBeans:这里所说的JavaBeans是根据XML 对应的DTD或Schema所产生的有级联关系的类。通过这些类逻辑上形成一棵XML树形结构,用于存放实际XML数据。对于如下的一部分DTD: 我们可以设计一个BookItem类,它包括一个TitleTxt字段、一个PriceTxt字段、一个AuthorBean字段以及一个YearAttr字段,其中AuthorBean由多个AuthorItem组成,类似的,AuthorItem包含它下面的节点信息。在这个过程中,可以完成ePath表的信息建立。 根据前面的映射模型,对于BookItem类的title字段,设计如下形式的类结构: Public Class BookItem(){ Private String titleTxt; Public setTitleTxt(String title){} Public getTitleTxt(){} Public setTitleParentID(int parentID){} Public getTitleParentID(){} Public setTitleOrder(){int order} Public getTitleOrder(){} … } 而对于AuthorBean类,类结构设计如下: Public Class AuthorBean(){ Private Vector beanVector; Public void add(AuthorItem authorItem){} Public AuthorItem getByIndex(int index){} Public int getSize(){} … } 从结构上容易看出,代码量非常大,但由于都是一些get()和set()方法,这些代码不用通过手工去撰写,而是根据DTD或Scheme的信息自动生成。在过程①及过程④中调用set()方法,在过程②及过程③中调用get()方法。 XML Operator:该模块可以支持DOM、SAX解析。根据层次信息依次解析每个节点,此过程中记录父子节点关系,并且记录一个节点中所有子节点的先后顺序,并设定到Bean中。 SQL Operator:该模块主要是把Bean中的信息写入数据库,以及从数据库中读取信息供重组XML。 5 总结 本映射模型通过保存结点路径,查询时可减少连接次数。另外,把属性及文本节点的值保存在同一个表中,若只查询某个结点下的信息,可以不进行自连接,很好地支持局部查询。在转换方法上,我们设计一个中间层,负责存储解析过的信息,并分别提供生成XML及保存到SQL的方法,而这层的大部分代码都是自动生成的。根据需求,还可以方便加入自定义的处理模块。然而,本模型要求被解析的XML文件必须要有DTD或Schema,使得应用上受到一定的局限性。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-30 05:32 , Processed in 0.091307 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.