目 录
1.0 简介
2.0 XML是数据库吗?
3.0 为什么用数据库?
4.0 数据与文件
4.1 以数据为中心的文档
4.2 以文档为中心的文档
4.3 数据,文档和数据库
5.0 数据的存取
5.1 将文档Schema映射到数据库Schema
5.1.1 基于表格的映射
5.1.2 关系 - 对象映射
5.2 查询语言
5.2.1 基于模板的查询语言
5.2.2 基于SQL的查询语言
5.2.3 XML Query 语言
5.3 在原生XML 数据库中存储数据
5.4 数据类型, Null 值, 字符集, 及其他
5.4.1 数据类型
5.4.2 二进制数据
5.4.3 Null 数据
5.4.4 字符集
5.4.5 处理指令和注释
5.4.6 标记的存储
5.5 从关系[数据库]Schema产生DTD以及相反
6.0 文件的存取
6.1 在文件系统中存储文件
6.2 在BLOB中存储文件
6.3 原生XML数据库
6.3.1 什么是原生XML数据库?
6.3.2 原生XML数据库的架构
6.3.2.1 基于文本的原生XML数据库
6.3.2.2 基于模型的原生XML数据库
6.3.3 原生XML数据库的特性
6.3.3.1 文件集
6.3.3.2 查询语言
6.3.3.3 更新和删除
6.3.3.4 事务,锁定,以及并发
6.3.3.5 应用程序接口(APIs)
6.3.3.6 双程车票
6.3.3.7 外部数据
6.3.3.8 索引
6.3.3.9 外部实体存储
6.3.4 规范化,引用完整性和可伸缩性
6.3.4.1 规范化
6.3.4.2 引用完整性
6.3.4.3 可伸缩性
6.4 可持久化 DOM (PDOM)
6.5 内容管理系统 CMS
7.0 XML 数据库产品
8.0 相关链接
9.0 评论与反馈
1.0 简介 (Introduction)
本文对怎样使用XML和数据库进行了总体回顾,描述了以数据为中心和以文档文中心的文档之间的差异如何影响其在数据库中的应用,将XML和关系型数据库的一起使用的常见用法,以及什么是原生XML数据库和何时使用它。
2.0 XML是数据库吗?(Is XML a Database?)
在开始讨论XML和数据库之前,我们先回答许多人都遇到过的问题:“XML是数据库吗?”
如果仅按数据库这个术语的本质来看,XML文件就是数据库,它是数据的集合。在许多方面看起来它和其他文件没什么区别 -- 无论如何,每个文件都含有某种类型的数据。作为一种“数据库”格式,XML有一些优势:例如,它是自描述的(所用的标记描述了数据的结构和类型,尽管缺乏语义),可交换的(portable)(Unicode),能够以树型或图形结构描述数据。同样它也有缺点,例如,它显得有些繁琐,由于要对它进行解析和文本转换,所以数据访问速度较慢。
一个更有用的问题就是在较为宽松的意义上,XML及其周边技术是否可以算作“数据库” -- 数据库管理系统(DBMS)。答案是“在某种程度上是(sort of)”。从正面来说,XML提供了许多数据库所具备的东西:存储(XML文档), 模式(DTD, XML schema,RElAX NG 等等), 查询语言(XQuery, XPath, XQL, XML-QL, QUILT等等),编程接口(SAX, DOM,JDOM)等等。从反面来说,它缺少一些作为实用的数据库所应具备的特性:高效的存储,索引,安全,事务和数据一致性,多用户访问,触发器,在查询多个文件等等。
因此,尽管在数据量小、用户少和性能要求不太高的环境下,可以将XML文档用作数据库,但是却不适用于用户量大、数据集成度高以及性能要求高的作业环境。
XML适合于用作所谓“数据库”的一个好例子就是 .ini文件 -- 它包含应用程序的配置信息。与其写一个处理以逗号分隔(comma-delimited)的文件的解析器,开发一种小型的XML语言并写一个解释它的 SAX程序要容易的多。此外,XML允许使用嵌套的实体,而逗号分隔的文件(comma-delimited files)很难做到这点。然而,说它就是数据库还很勉强,因为它是线性读写的,而且仅用在程序开始和结束时。
比较适合于XML数据库的一些复杂的数据集就是个人通讯录(名字,电话号码,地址等),或用于描述浏览器书签以及用Napster偷来的MP3。然而,由于dBase和Access之类的数据库物美价廉,即使在这种情况下似乎也没有多少理由把XML文件作为数据库使用。XML的唯一真正好处就是数据的可交换性(portable),由于有越来越多的工具可以用来对数据库进行XML序列化(serializing),这一点好处似乎也要打些折扣。
3.0 为什么要用数据库?(Why Use a Database?)
当你开始考虑XML和数据库的时候,可能首先会问这个问题:为什么你会先想到使用数据库?你是否有可用的历史数据?是否想找个地方存储Web页面? 是否在电子商务中使用数据库,而XML在其中作为数据传输载体? 对这些问题的回答将会极大地影响你对数据库和中间件(如果有的话)的选择,以及如何使用所选的数据库。
例如,你有个电子商务的应用,将XML用作数据交换。那么你的数据最好有个非常规则的结构并且可供非XML程序使用。还有,XML文档所用的某些东西如实体和编码对你来说并不重要 --总之,你感兴趣的是数据,而不是它在XML内如何存储。在这种情况下,你大概需要一个关系型数据库以及在XML和数据库之间转换数据的软件。如果你的应用程序是面向对象的,你甚至还需要一个在数据库或XML中存取这些对象的系统。
另一方面,假如你要从一些结构松散的XML文档建立一个网站。你不但要管理这个网站,还要提供站点内容搜索。你的文档看起来结构比较松散,其中的实体的使用对你来说可能更重要,因为它们是文档结构的重要部分。这种情况下,你也许需要一个原生XML数据库(native XML database)或内容管理系统(content management system)。这使你可以保持文档的物理结构,支持文件级的事务处理,以及使用XML Query语言进行查询。
4.0 数据和文档 (Data versus Documents)
在选择数据库时最重要因素大概就是你想在数据库存储的究竟是数据还是文档。例如,是简单地把XML当作数据库和(可能不支持XML)应用程序之间的数据转换工具,还是用于集成,就像XHTML和DocBook中的那样?通常这是个偏好,但是却非常重要,因为所有以数据为中心的(data-centric)文档有着许多相同的特性,所有以文档为中心的(document-centric)也有许多相同的特性。这会影响到XML在数据库中如何存储。下面两部分中我们就来考察这些特性。
(历史背景:我在XML-dev邮件列表上第一次听说data-centric和document-centric这些术语,不知道是谁发明的,但是我在1997的消息中发现有使用document-centric的,从1998年以后这两个术语都有使用。)
4.1 以数据为中心的文档 (Data-Centric Documents)
以数据为中心的文档就是将XML用作数据的传输载体,只提供给机器消费的文档,在此XML通常并不是绝对必要的。也就是说,对于应用程序或数据库而言,(在某个时间段内)数据是否以XML文档的形式存储并不重要。以数据为中心的文档的例子有销售订单、航班时刻表、科研数据及股市汇率。
以数据为中心的文档的特点是结构相当规整,数据粒度精细(fine-grained data)(即最小的独立数据单位只存在于PCDATA元素或属性这一级别),很少或没有混合内容。除非在对文档进行验证的时候,同级元素或PCDATA的出现次序一般来说并不重要。
以数据为中心的文档中的这类数据可以来自数据库(此时要输入给XML)或在数据库之外(此时要将其存入数据库)。前者的一个例子就是关系数据库现存的大量数据;而从测量系统采集并转化为XML的科研数据就是