【IT168分析评论】
【聆听IT专家讲座,了解如何降低数据管理成本,更有机会获得限量蓝牙耳机!】
【了解更多数据管理产品信息。】
XML被越来越广泛地用于信息交换和对复杂信息的描述。对XML的存储和管理并不是什么新的技术。各大数据库厂商Oracle,DB2,SQLServer从较早版本都能够通过各种途径来支持。但由于XML本质上是一种层次型的数据模型,通过关系型数据库技术对XML的支持难免会有一些问题和局限性。
传统的方式下,开发人员对XML 的存储和访问一般通过两种方式,这也是目前开发人员基于Oracle数据库可以采取的两种方式:
(1) 将XML保存为大对象CLOB/BLOB 或者 Varchar。保存样例如下:

大对象的方式将XML作为黑盒处理,丢掉了XML原有的结构化的嵌套信息,当人们需要对XML的内容作访问的时候,不得不把黑盒的内容拉出来进行解析处理。解析的方法包括DOM解析和SAX解析。DOM解析的结果是一棵内存中跟XML结构相对应的树结构,需要占用大量的系统资源尤其内存资源,在数据量大的情况下内存容易成为瓶颈从而难以保证效率,其好处是之后对XML树结构的遍历和查询比较方便。SAX解析是基于XML标签事件的,在资源消耗上比DOM解析少很多,处理速度比DOM解析更快,但由于SAX解析并不维护内存中的树结构,所以对XML的内容查询不够方便和灵活。如果应用本身对XML节点的查询需求更多一些,采用DOM解析的方式更方便。
将XML保存为大对象的方式,丢弃了XML自身的一些信息。后续对XML内容的访问完全依赖于开发人员的编码工作,无论实现上文的DOM解析还是SAX解析代码量都不可小视,在生产环境中如何保证良好的性能也是人们所担心的。
(2) 将XML经过Shredding(拆分)的方式,映射到关系型的数据库。
过去由于缺乏对XML层次模型支持的技术,人们通过拆分的方式变相实现对XML层次数据模型的支持。示例如下: 
对任意一个XML文档结构,至少需要一到多个具有关联关系的二维表来描述。为了实现对XML文档内容的查询,需要把二维表Join起来再检索。XML文档原本能够很好地去适应需求的变化,这种适应只需要通过对XML节点的调整(在相应层次的增加或减少)。通过关系表关联等价的实现面对需求的变化实现起来很被动,调整的代价不菲,任何开发人员都不愿意在项目实施中或实施后再去调整底层表结构。
应该说,这两种传统的实现方式跟基于何种数据库本身没有必然联系。无论是Oracle 9i, 10g 还是DB2 8, DB29 中,开发人员都可以使用任意一种方式通过数据库来管理XML。尤其Clob大对象的方式,无论是存储到Oracle还是DB2,数据库只是一个存储的池子,后续处理完全依赖于开发人员的编码工作。从早先的版本起,各个数据库内部尝试用拆分的方式存储和管理XML数据模型。 包括DB2 8的XML Extender, 也包括Oracle的10g. 这种通过拆分方式支持XML的数据库被称之为 XML-Enabled 数据库,特点是通过关系数据模型变相支持XML,自然有很多技术上的局限性。由数据库自动进行拆分的方式,要求XML文档事先必须是有Schema的;拆分成表的批量处理方式必然会导致数据库内部有很多空字段,带来存储上的浪费;满足大数据量的查询性能容易成为瓶颈;关于XML查询和索引的支持都会有很多局限性。后面会做具体技术点的比较。
2006年7月DB2 9 正式发布,其中最重要的技术突破就是对XML的支持,被称之为Native的XML Support。所谓Native,意味着:
(1)不需要在XML层次模型跟其他模型之间作转换
(2)不需要拆分
(3)不需要存成大对象文本串。
XML数据模型在DB2 9中被真正地作为层次模型来支持。从磁盘上的最小的存储单元开始,保存的就是XML对应的树结构。这棵树类似于XML经过DOM解析后得到的树结构。(实际上XML 文档被插入DB2 9的时候是通过SAX解析的方法被解析的,而之后存储到磁盘上的效果遍历起来如同DOM树一样方便)。下面这张图简单示意了XML在DB2 9中的存储机制。

基于树形结构的存储,DB2 9 直接支持国际标准的XML查询语言Xquery(包含Xpath标准的支持)。先前开发人员需要很多Coding 才能实现的XML解析和查询工作现在直接通过调用一条Xquery即可实现。除了存储机制,查询机制,配套的还有XML的索引机制,XML Schema的管理机制等。由于对XML的Native支持,DB2 9 不再是单纯的关系型数据库,而是同时支持关系型和层次性数据模型的混合型数据库。一方面继承原有的二维数据库技术,支持标准的SQL查询二维表;另一方面一套完善的XML Native 技术,支持标准的Xquery查询XML层次模型;同时二维的SQL查询和层次的Xquery查询还可以互相嵌套实现两种数据模型的关联查询。
DB2 9 是第一个能同时支持关系型又能支持层次型的混合型数据库。混合型的引擎面向过去,能够兼容老的基于关系型数据库设计的系统;面向未来,能够很好的适应未来IT和业务系统灵活多变的业务需求,发挥XML的灵活性优势。