目录
1. 概述
2. 基于表的映射
3. 对象-关系映射
3.1. 基本映射
3.1.1. 映射 DTD 到对象模式
3.1.2. 映射对象模式到数据库模式
3.1.3. 杂记
3.2. 映射复杂内容模型
3.2.1. 映射序列
3.2.2. 映射选择
3.2.3. 映射重复子元素
3.2.4. 映射可选子元素
3.2.5. 映射子组
3.3. 映射混合内容
3.4. 映射次序
3.4.1. 同级次序, 层次次序, 和文档次序
3.4.2. 映射同级次序
3.4.2.1. 次序属性和列
3.4.2.2. 在映射中存储次序
3.5. 映射属性
3.5.1. 映射单值和多值属性
3.5.2. 映射 ID/IDREF(S) 属性
3.5.3. 映射注记属性
3.5.4. 映射 ENTITY/ENTITIES 属性
3.6. 可供选择的映射
3.6.1. 映射复杂元素类型到标量类型
3.6.2. 映射标量类属性到属性表
3.7. 结论
4. 生成模式
4.1. 从 DTD 生成关系数据库模式
4.2. 从数据库模式生成 DTD
5. 映射 XML 模式到数据库
6. 有关的话题
--------------------------------------------------------------------------------
1. 概述
在 XML 社团中一个常见的问题是如何把 XML 映射到数据库。本文讨论两种映射: 基于表的映射和对象-关系(基于对象)的映射。这两种映射都建模在 XML 文档中的数据、而不是文档自身。这使得这些映射对于以数据为中心的文档是良难≡瘢杂谝晕牡滴行牡奈牡凳瞧斗Φ难≡瘛;诒淼挠成渫耆荒艽砘旌夏谌荩旌夏谌莸亩?关系映射是非常低效的。
这两种映射通常用做在 XML 文档和数据库、特别是关系数据库之间传输数据的软件的基础。它们在这方面的一个重要特征是双向的。就是说,它们可以用来从 XML 文档向数据库、从数据库向 XML 文档传输数据。 结果之一是它们可用做规范映射,在它顶上的 XML 查询语言可以被建造在非 XML 数据库上。规范映射将定义可以用类似 XQuery 的某种东西来查询的虚拟 XML 文档。
除了在 XML 文档和数据库之间传输数据之外,对象关系映射首要角色是用在“数据绑定”之中,这是在 XML 文档和对象之间的数据集结和解散。
2. 基于表的映射
在下面的 XML 文档和表之间有明显的映射:
<A>
<B>
<C>ccc</C> Table A
<D>ddd</D> -------
<E>eee</E> C D E
</B> --- --- ---
<B> <=> ... ... ...
<C>fff</C> ccc ddd eee
<D>ggg</D> fff ggg hhh
<E>hhh</E> ... ... ...
</B>
</A>
它叫做基于表的映射。它把文档看成一个单一的表或一组表。文档的结构必须是
<Table>
<Row>
<Column_1>...</Column_1>
...
<Column_n>...</Column_n>
</Row>
...
<Row>
<Column_1>...</Column_1>
...
<Column_n>...</Column_n>
</Row>
</Table>
或者是
<Tables>
<Table_1>
<Row>
<Column_1>...</Column_1>
...
<Column_n>...</Column_n>
</Row>
...
</Table_1>
...
<Table_n>
<Row>
<Column_1>...</Column_1>
...
<Column_m>...</Column_m>
</Row>
...
</Table_n>
</Tables>
同这个限制在一起的还有,列数据可以被表示为唯 PCDATA 元素(可显示的)或属性。
这种映射的明显的优点是它的简单性。因为它匹配在关系数据库中的表和结果集的结构,基于这种映射写代码很容易、快速、缩放自如,并对特定应用非常有用,比如在数据库之间一次一个表的传输数据。
这种映射有许多缺点;首先,它只能处理 XML 文档的非常小的子集。此外,它不保存物理结构(比如字符和实体引用,CDATA 段,字符编码,和孤立的声明)或文档信息(比如文档类型或 DTD),注释,或处理指令。
基于表的映射通常被中间件用来在 XML 文档和关系数据库之间传输数据。它还在某些 Web 应用服务器中用来把结果集数据返回为 XML。
3. 对象-关系映射
由于基于表的映射只能处理 XML 文档的一个有限的子集,一些中间件工具、多数启用 XML 的关系数据库、和多数启用 XML 的对象服务器使用一个更加完善的映射,它叫做对象-关系映射。它把 XML 文档建模为特定于在文档中数据的对象的一个树,接着把这些对象映射到数据库。
(名字“对象-关系”实际上是用词不当的 -- 更好的名字是基于对象的映射。这是因为对象可以被映射到非关系数据库,比如面向对象数据库或层次数据库, 或者简单的不去管它,在数据绑定系统中就是这么做的。但是,由于对象-关系是一个熟知的术语而且这种映射通常与关系数据库一起使用,所以这里用了这个术语。此外,所有例子都使用关系表。)
要理解对象-关系映射,最好先看一下一些简单的例子。作为开始,注意在下面 XML 文档、对象、和在表中的行之间有明显的映射:
XML 对象 表
============= ============ ===============
Table A
<A> object A {