Yiwei's profile我以维的世界PhotosBlogLists Tools Help

Blog


    April 02

    从DTD到数据库的映射——2

    1.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

    例如,下面的例子中简单元素类型BDE和属性F都被映射成String,复杂元素类型AC被映射到类A和类C中。内容模型及AC的属性被映射成为类A和类C的属性。在内容模型里,对AC中的BDE的引用被映射为String特性(因为BDE均被映射为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;

                                           }

    在这里需要反复强调的一点是,在内容模型中对元素类型引用的映射,与映射元素类型本身是不同的。元素类型映射为数据类型,然而元素类型引用则映射为结构化数据类型(类)的特性。当你考虑一种元素类型被两种不同内容模型所引用时,上述的不同就显而易见了。既然如此,每个引用必须被单独的映射,根据元素类型被映射为何种数据类型而决定结果特性的数据类型。

    例如,注意下面例子中TitleSection两个元素类型。在ChapterAppendix两个内容模型中都引用了TitleSection两个元素类型。每个引用所涉及的元素类型都被单独的进行映射。ChapterTitle的引用(即 类特性)被映射为String类型,这是因为,Title元素类型只含有PCDATA,并且其被映射为一个字符串StringChapterSection的引用(即 类特性)被映射为一个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模式本身含有数据类型。

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://vane-zhang.spaces.live.com/blog/cns!15C6882C30119870!301.trak
    Weblogs that reference this entry
    • None