曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
• 如果元素節點是一個子節點,創建一個與父元素節點同名的列,但是使用前綴f k _。
• 創建一個在剛創建的列和與其父元素節點同名的表中的列的外鍵關系,列的名字是父元素
的名字加一個前綴p k _。
• 如果元素節點的內容只是本文,那么創建一個名字為p c d a t a的列。
一個元素的多發性是在< R e c S u b j C a t e g o r i e s >里定義的:
程序清單1 0 - 4 6
< R e c S u b j C a t e g o r i e s >元素本身容易模擬;只要創建一個新表。可能有一些冗余—因為在
第10章XML和數據庫使用401 下載
這種情況下一個< C a t e g o r y >可能只關聯了一個< B o o k >—但是我們不得不保留看上去冗余的表,
以便在需要時重建正確的X M L結構(在后面將進一步討論)。
比較難于模擬的部分是< C a t e g o r y >元素出現了三次。這意味著我們不能使用通常的規則,因
為既不能創建三個名為C a t e g o r y 的表— 如果C a t e g o r y 元素不只是文本— 也不能在
R e c S u b j C a t e g o r i e s表中創建三個名叫C a t e g o r y的表—因為< C a t e g o r y >只是文本。
我們有一個規則說明,如果一個元素發生一次以上,它必需放在自己的表中,所以我們將
創建一個名為C a t e g o r y的表。然而,我們會看到當開始寫元素處理代碼時,需要:
• 在當前的分層中計算元素的處理會發生的次數。
• 不要在一個元素再次發生時創建一個新表。
如果按照下面的定義,結果表將沒有什么不同:
程序清單1 0 - 4 7
實際上一個觸發器只能觸發3次。
注意這個規則假設后續的分類不重要。如果很重要,可以在SQL DDL中加入位置指示器用
來指示元素顯示的順序。
(5) 枚舉
在我們查看關于地址的模式時,你可能已經認識到h e a d q u a r t e r s屬性值只能是y e s或n o。一種
可以實現的方法是把h e a d q u a r t e r s創建為一個布爾字段,但這在后面可能會產生問題,例如再增
加一個'Used To Be'的選項。這樣的話,我們希望建立對枚舉的一般的需求,以便可以用在任何
環境下。
首先,需要設置一個表,用來保存枚舉值(如圖1 0 - 2 8)。把它叫做e n u m _ h e a d q u a r t e r s用來
減少與其他名字沖突的可能性。
圖10-28
這個表僅有一列,因為它只需要包含h e a d q u a r t e r s所可能有的值。因為
它們是唯一的,所以可以被設置為主鍵。在表中的數據如圖1 0 - 2 9所示。
這就給出枚舉的規則:
• 規則5—對于每一個具有枚舉類型的屬性,用與屬性節點值相同的
名字創建一個表,使用前綴e n u m _。包含一個與屬性節點同名的可變長字符串列,使用前
綴p k _ e n u m _和variable-legnth string數據類型。把枚舉的值填在表中。
我們需要再次修改規則3,以保證不會丟失被枚舉的屬性的信息:
• 規則3—對于每個屬性節點:
402使用XML 高級編程
下載
圖10-29
• 創建一個與屬性節點同名的列:
- 如果屬性是一個正常的屬性使用前綴a t t r _。
- 如果屬性是一個枚舉類型使用前綴a t t r _ e n u m _。
• 如果要求屬性,那么列不應該允許為N U L L值。
實際上我們仍然沒有完成規則3!在后面會看到更多⋯⋯
(6) 擁有i d數據類型的屬性
出版商的定義的下一部分是它的名稱和地址的列表:
程序清單1 0 - 4 8
每一個< P u b l i s h e r >都有一個叫做< I m p r i n t s >的元素,按順序包含名為< I m p r i n t >的元素。每
一個< I m p r i n t >元素都有一些文本,像名稱和地址的標題和一個叫s h o r t I m p r i n t N a m e的屬性,它是
i d類型數據。
使用規則2我們創建了兩個新表, I m p r i n t s和I m p r i n t,每一個都指向它們的父元素。第一個
表看上去如圖1 0 - 3 0所示。
圖10-30
第二個表—I m p r i n t—包含文本內容,所以有一個p c d a t a列。這也是按規則2處理的。僅
有一件事我們沒有注意到,就是s h o r t I m p r i n t N a m e屬性。這個屬性為i d類型,意思就是它將用于
X M L文檔的其他部分,用來引用一個元素。實際上,這個模式已經設置了這樣一種方式就是
< T h r e a d >元素—稍后我們就會看到—可以通過引用它的簡稱來指向一個名稱地址。因為使
用了枚舉信息,我們不想丟掉這個信息,所以我們通過在列的前面加上a t t r _ i d _來保留它。所以
修改規則3:
• 規則3—對于每個屬性節點:
• 創建一個與屬性節點同名的列:
- 如果屬性是一個正常的屬性使用前綴a t t r _。
- 如果屬性是一個枚舉類型使用前綴a t t r _ e n u m _。
- 如果屬性是i d類型使用前綴a t t r _ i d _。
• 如果要求屬性,那么列不應該允許為N U L L值。
所以I m p r i n t表看上去如圖1 0 - 3 1所示。
第10章XML和數據庫使用403 下載
圖10-31
(7) 作為容器的元素
注意在這里我們介紹的一些冗余的東西是不可避免的。如果我們在設計這個數據庫的時候
沒有想過將數據輸出為X M L,那么可能不需要I m p r i n t s表,因為它只允許I m p r i n t表中的名稱地址
能夠同P u b l i s h e r表相連接。像這樣的一個表結構通常是用在當想讓每一個出版商有許多名稱地
址的時候,但是在我們的模式中,每一個出版商僅有一個名稱地址。如果我們從節點的角度來
表現這個數據庫結構,那么下面如圖1 0 - 3 2所示的兩個結構沒有什么不同。
圖10-32
這是因為,I m p r i n t s沒有自己的數據—它只是其他數據的一個簡單容器。然而,盡管我們
想使關系數據庫盡可能的高效,但也不得不保留這個表,與沒必要的多個的連接在一起。否則
當輸出X M L的時候,將沒有辦法知道在< P u b l i s h e r >與每個< I m p r i n t >之間有一個包含元素。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(131)