燕 卫
(厦门海洋职业技术学院,福建 厦门361012)
随着XML的广泛应用,XML正在成为数量庞大的数据源,如何利用RDBMS强大数据管理功能管理XML数据已成为一个研究热点,由于XML数据与关系数据库的数据模型不同,实现XML数据与数据库数据的相互转换显得尤为重要。
将XML文档映射为关系模式进行存储,有两大类映射方法:模型映射和结构映射。对于模型映射,利用xml文档中的数据模型的结构显性或隐性地映射成其他数据模型的结构,要实现数据库和xml文档间的数据转换的关键是在数据库模式和schemas和DTD之间建立映射关系,用具体的模型来实现数据间的映射。
一个XML文档是一个树状结构,能够用一个有序有向边标记图来表示,按深度有限的原则从树叶往树根搜索,每碰到一个内部节点则创建对应的抽象数据类型,直到根节点的直接子节点,创建基于次根节点所对应的抽象数据类型对象,该对象就是根节点对应的对象,最后将XML文档中各元素的属性值填入对象中的相应域。
有了XML图之后,用来存储边信息的边表有三种设计方案:Edge、Binary、Universal三种边表设计方案和两种值表设计方案,一共有六种存储模式。通过对结构关系数据库大小,执行不同类型XML查询的执行时间,从关系数据重构XML文档的时间等三个性能参数进行量化分析,结论是:Binary边表带内联值表的存储模式能获得最好的综合性能。
一个XML文档可以被建模为一个树,因此,一个XML文档的集合可以被建模为一个森林。一个根结点的树指向一个XML文档,一个根结点是非文档结点的树指向一个XML文档片段。因此一个XML查询即可以在一个XML文档树或文档森林上进行,也可以在一个XML文档片段或森林片段上进行。
如何从一个DTD生成一个关系型结构?对于每种包含元素或者混合内容的元素类型,新建一个表和一个主键字段,对于每个包含混合内容的元素类型,创建一个单独的表格,其中存放未析数据,通过父元素主键链接到父表格,对每个有元素或者混合内容的子元素,通过父元素主键将父元素表格和子元素表格相连接。
如何从一个关系型的结构生成一个DTD?对于每个表新建一个元素,对于表格中的每个字段,新建一个属性或者是只包含未析数据的子元素;对于每个表格字段中提供主键的主键/外键的关系都新建一个子元素。
为了有效地实现对文档树中任意两个结点对之间的祖先/后裔关系,利用扩展先序列表写出它的先序遍历序列,然后根据图中各个节点左右孩子的状况进行加以遍历。基于节点的索引本质上即是将XML数据分解为数据单元的记录集合,同时在记录中保存该单元在XML数据中的位置信息。通过编码技术索引每一个节点,节点之间的结构关系通过编码可以在常数时间内确定它可以很好地支持正则路径表达式。
XML文档到数据库的映射往往忽略XML文档的物理结构(例如实体、引用文本部分及编码信息)及某些逻辑结构(如处理指令、注释以及子元素和模型组在元素声明中出现的顺序)。因为数据库和应用程序只关心XML文件中的数据,因此在映射算法中先不考虑这些物理结构和逻辑结构的映射。
根据上述映射规则,可以将元素之间的树型关系存入RDBMS。不过,首先需要对XML文档进行解析以获得DOM树,并且要给DOM树中的每个元素节点分别绑定唯一的ID(这在遍历DOM树时实现)。事先建一张元素关系表,表的字段分别代表当前元素节点的ID、当前元素节点的父节点ID、当前元素节点的名称。然后根据上述算法对XML文档进行解析。
根据上述的存储策略,可以从关系数据库中将数据恢复成XML形式:根据元素关系表来建立XML文档中元素的嵌套关系,并分别查询元素内容表和属性值表来将各元素的内容和各元素的属性及值插入元素节点。
这个原型系统实现了两种方法的存储,一种是以块结构存储,第二种以模型为基础的映射存储,通过原型的实现让我们可以更加清楚直观的理解XML存储到关系数据库的概念。
整个原型系统的工作流程是将读入的XML文件经过解析遍历,并在遍历的同时进行判断结点类型,插入相应的关系数据库表中。
(1)classRdb主要用于创建数据库的连接。
(2)classtest主要用于实现解析文档并映射到关系数据库的工作,这是对于上述算法的具体实现,主要实现函数有test(),stepThrough(Node start),complex(Node node)。
(3)classblobstore主要用于以块结构存储XML文档。
(1)classAppFrame中调用了javax.swing.filechooser.*;这个包并重载了它,使它实现了对于文件过滤的功能。
(2)classsccuce用来判断文件存储成功与否,使用了弹出框的形式。
(3)classErrorDialog可以用来显示程序运行过程中的一些异常,如文件已经存在关系数据库中的重复存储的异常。