日期:2009-08-29  浏览次数:20366 次

3.4. 映射次序

本节讨论对象-关系映射如何处理次序。


3.4.1. 同级次序, 层次次序, 和文档次序


同级(Sibling)意味着“兄妹”。就是说,同级元素或 PCDATA 是有相同父元素的元素或 PCDATA。换句话说,它们出现在同一个内容模型中。例如,如果在前面的章节中文档被表示为一棵树,这很容易的显示出那些元素是同级的: 这些元素在这个层次的第二级上,都有 A 作为它们的父元素。

A
___________________________|______________________
| | | | | | | | |
This text C makes B no sense C except as B an example
| | | |
cc bbbb cccc bb

注意在第这个层次的第三级的元素不是同级的,因为它们不共享相同的父元素。这还指出了同级次序,它是在它们的父元素中子元素出现的次序,和层次次序,它是子元素在表示文档的树中出现在的级别,二者之间的不同。不同的还有文档次序,它是元素和文本在一个 XML 文档中出现的次序。例如:

同级次序(只有一个同级元素的地方次序不显示):

A
___________________________|______________________
| | | | | | | | |
This text C makes B no sense C except as B an example
1 2 3 4 5 6 7 8 9
| | | |
cc bbbb cccc bb

层次次序:

1 A
___________________________|______________________
| | | | | | | | |
2 This text C makes B no sense C except as B an example
| | | |
3 cc bbbb cccc bb

文档次序:

A
1
___________________________|______________________
| | | | | | | | |
This text C makes B no sense C except as B an example
2 3 5 6 8 9 11 12 14
| | | |
cc bbbb cccc bb
4 7 10 13

依据 XML 规定,同级次序是重要的。实际上,这依赖于应用。例如,在以数据为中心的应用中,使用 XML 文档来传载一个对象或表,同级次序通常是无关紧要的,因为面向对象语言没有在类属性之间的次序的概念。类似的,关系数据库没有在列之间的次序的概念。所以,同级次序在下列文档中不是重要的:

<Part>
<Number>123</Number>
<Desc>Turkey wrench</Desc>
<Price>10.95</Price>
</Part>

<Part>
<Price>10.95</Price>
<Desc>Turkey wrench</Desc>
<Number>123</Number>
</Part>

它们都被映射成下列对象和表中的行:

对象 表
========================= ===================================
Table Parts
object part { -------------------------------
number = 123 ==> Number Desc Price
desc = "Turkey wrench" ------ ------------- -----
price = 10.95 123 Turkey wrench 10.95

(对此的一个主要的例外是在以数据为中心的文档必须匹配一个特定的 DTD 的时候。这在一个应用必须验证文档的时候发生,比如在它们来自未知或不被信任的来源的时候。尽管在这种情况下 XML Schemas 的“all 组”通过允许一组子元素以任何次序出现能帮上忙,但它们不支持重复子元素。)

在另一方面,在以文档为中心的应用中,通常文档是为了人的消费而设计的,同级次序是非常重要的。例如,我很可能喜欢第一个评述而不是第二个:

<Review>
<p>Ronald Bourret 是一个
<b>优秀的作家</b>。
只有<b>傻瓜</b>
才不去读他的作品。</p>
</Review>

<Review>
<p>Ronald Bourret 是一个
<b>傻瓜</b>。只有
<b>优秀的作家</b>