| Yiwei's profile我以维的世界PhotosBlogLists | Help |
|
April 02 从DTD到数据库的映射——21.1. 基本映射 构造对象关系型映射需要两个步骤。首先,一个XML模式(以DTD为例)被映射到对象模式,然后对象模式被映射到数据库模式。这两个映射可以任选其一,组合成一个直接的DTD到数据库的映射,这种做法被当今大多数软件所使用。 考虑如下这个例子,映射所使用的对象对每一个DTD模式都是特定的,而非从DOM中得到的对象。实际上,这些对象在XML文档中模仿数据,同时,DOM模仿XML文档结构。举个例子,下图表示一个数据具体型对象的对象树和DOM,二者可以由上文中的XML文档样例构造: SalesOrder Document / \ | Item Item Element_______ ______/ / \ \______ \_________ / / \ \ \ Element Element Element Element Element | | | / | \ \ etc. Text Text Text / | \ \_______ / | \ \ Element Element Element Attr | | | | Text Text Text Text 当你考虑数据是如何在数据库中存储时,这一差别将极其重要。当存储数据具体型对象时,你需要得到SalesOrders 和 Items两个基本表;当存储DOM对象时,你需要得到Document, Element, Text, 和Att这几个基本表。二者最重要的区别在于非XML应用可以使用数据具体型基本表而不能使用DOM具体型基本表。 1.1.1. 从DTD到对象模式的映射 映射首先识别元素类型就是数据类型。元素类型中的PCDATA只读内容被称作简单元素类型;这一术语借鉴于XML模式。这种元素类型拥有一个单独的数值,它等同于面向对象编程语言中的标量数据类型。(请注意这里的“标量”意为由单一数值构成。在一些语言中,“标量”数据类型——在有些情况下用“对象”表示。最明显的例子是JAVA语言中的String数据类型)。属性类型同样也是简单类型。 那些拥有有元素或者复合内容的,或还拥有属性的元素类型被称为复合数据类型;该术语同样借鉴于XML模式。这种复合数据类型拥有结构性的值,它等同于面向对象编程语言中的类的概念,或等同于C语言中的结构概念。请注意一个拥有空内容但有属性的元素类型仍旧是复合元素类型。其原因是属性值同样提供结构并且其近似于PCDATA只读的子元素。 对象关系型映射首先将简单类型映射到标量数据类型。据个例子,元素类型Title可以被映射成一个字符串值String,元素类型可以被映射成一个浮点类型值float。然后将复杂类型映射到类,在复合类型的内容模型中的每一个元素类型被映射到类中的一个属性值。每一个属性值的数据类型就是映射所涉及的元素类型。例如:对Title元素的引用可以被映射成一个字符串String类型属性值,对Price元素的引用可以被映射成一个浮点类型float属性值。对复合元素的引用,通常可以被映射成为该复合元素被映射成的类中的一个对象的指针或索引。 映射的最后步骤就是将属性值映射成为特性值,特性值的数据类型由属性值的数据类型决定。请注意:属性值类似于在内容模型中对元素类型的引用。这是因为,属性值就像内容模型中的引用一样,对于给定的元素类型是局部的。唯一概念上的不同是属性类型是局部定义的,而非像元素类型那样是全局层面上定义的。(如DTD) 例如,下面的例子中简单元素类型B、D、E和属性F都被映射成String,复杂元素类型A、C被映射到类A和类C中。内容模型及A和C的属性被映射成为类A和类C的属性。在内容模型里,对A和C中的B、D、E的引用被映射为String特性(因为B、D、E均被映射为String类型),属性F同样被映射成String特性。在A的内容模型中,对C的引用被映射为一个类型指针所指向的类C的一个对象,因为元素类型C被映射为类C。 DTD Classes ========================= ============= <!ELEMENT A (B, C)> class A { <!ELEMENT B (#PCDATA)> String b; <!ATTLIST A ==> C c; F CDATA #REQUIRED> String f; }
<!ELEMENT C (D, E)> class C { <!ELEMENT D (#PCDATA)> ==> String d; <!ELEMENT E (#PCDATA)> String e; } 在这里需要反复强调的一点是,在内容模型中对元素类型引用的映射,与映射元素类型本身是不同的。元素类型映射为数据类型,然而元素类型引用则映射为结构化数据类型(类)的特性。当你考虑一种元素类型被两种不同内容模型所引用时,上述的不同就显而易见了。既然如此,每个引用必须被单独的映射,根据元素类型被映射为何种数据类型而决定结果特性的数据类型。 例如,注意下面例子中Title和Section两个元素类型。在Chapter和Appendix两个内容模型中都引用了Title和Section两个元素类型。每个引用所涉及的元素类型都被单独的进行映射。Chapter中Title的引用(即 类特性)被映射为String类型,这是因为,Title元素类型只含有PCDATA,并且其被映射为一个字符串String。Chapter中Section的引用(即 类特性)被映射为一个Section对象,这是因为Section元素类型是一个复合元素类型并被映射为一个Section类。 DTD Classes ========================================= ============= <!ELEMENT Chapter (Title, Section+)> class Chapter { <!ELEMENT Appendix (Title, Section+)> ==> String title; <!ELEMENT Title (#PCDATA)> Section[] sections; <!ELEMENT Section (#PCDATA | p | b | i)*> }
class Appendix { String title; Section[] sections; }还有一点需要强调,简单元素类型及属性可以被映射为除String以外的其他数据类型。例如,一个名位Quantity的元素类型可以被映射为一个整形数据类型(integer)。当从一个DTD中进行映射时,需要人们的手动干预,因为我们不可能由一个PCDATA只读元素类型推测我们所需的目标数据类型。但是,当从一个XML模式中进行映射时,目标数据类型就是可知的,因为XML模式本身含有数据类型。 TrackbacksThe trackback URL for this entry is: http://vane-zhang.spaces.live.com/blog/cns!15C6882C30119870!301.trak Weblogs that reference this entry
|
|
|