曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
節點同名的表中的列的外鍵關系,列
的名字是父元素的名字加一個前綴
p k _。
(2) 屬性
我們需要的三個表中的第一個是P u b l i s h e r表。模式定義告訴我們所需要的表的信息:
程序清單1 0 - 4 3
就像< C a t a l o g >元素,一個< P u b l i s h e r >元素只能包含其他元素—它能包含非混合的內容。
元素是< C o r p o r a t e N a m e >,< A d d r e s s >,< I m p r i n t s >和< A u t h o r >,如圖
1 0 - 2 1所示。
應用分層規則我們建立了四張表,并且建立了它們之間的關系。
然而,< P u b l i s h e r >也有一個叫做i s b n的屬性節點。它可以非常容易地被
表示為P u b l i s h e r表的一個字段,并且我們將給它同節點一樣的名字。注
意,節點結構表明需要一個屬性節點,所以應該通過在表中增加要求
字段而實現它。因為不允許NULL值,所以如圖10-22所示定義這個列。
現在可以定義另一個規則:
• 規則3—對于每個屬性節點。
• 創建一個與屬性節點同名的列。
• 如果要求屬性,那么列不允許為N U L L值。
(3) 純文本元素
< P u b l i s h e r >元素可以包含的下一個元素是< C o r p o r a t e N a m e >,定
義如下:
<ElementType name="CorporateName" content="textOnly"/>
像第一個規則要求的那樣,我們將創建一個名為C o r p o r a t e N a m e的表。在根據規則設置好鍵
值之后,一個在P u b l i s h e r表和C o r p o r a t e N a m e表之間的一對一的關系就出現了,如圖1 0 - 2 3所示。
以一個數據庫的觀點,用于c o r p o r a t e N a m e的額外的表是不必要的。這就是說,數據被放入
到另外一個表,正像P u b l i s h e r 表的一列。而從X M L 角度,額外的表也是不必要的。
398使用XML 高級編程
下載
圖10-21
圖10-20
< C o r p o r a t e N a m e >元素的內容僅是文本—它不能包含任何子節點—所以可以被容易地存儲為
P u b l i s h e r表中的一列。因此, P u b l i s h e r表更有效的形式如圖1 0 - 2 4所示。
圖10-22
圖10-23
圖10-24
比起每一個元素都有一個表,它提高了性能,因為它不需要創建許多的連接來取得數據。
為了取得< P u b l i s h e r >信息,只需要下面的查詢:
然而使用一個獨立的公司名稱表,需要這樣做:
盡管看上去好像沒有什么多余的工作,只用了一個查詢來檢索出版商地址,但當我們看到
后面的地址模式時,將會發現這是多么的復雜—并且可能很慢。
在實現一個用于X M L數據的關系存儲時,應決定哪一個字段應該是屬性,哪一個應該是純
文本元素,這是件很容易的事。建好以后,剛剛在P u b l i s h e r表中描述的數據可以被輸出為元素:
程序清單1 0 - 4 4
或者輸出為元素的屬性:
我們沒有一個簡單的方法知道哪一個是更好的輸出,那么問題是用什么方法來表示數據庫
第10章XML和數據庫使用399 下載
是最佳的,但我們應能容易重新生成X M L。一種可以考慮的技術是在輸出之前,把模式當作數
據。另一種方法是在取得數據后,對它進行轉換,然后每一個字段作為屬性重新返回。
這兩種方法可能適用于不同的情況,被用在某些在前面關系數據庫部分所描述的工具中。
在這里我們使用了一個簡單方法,它是在數據庫中將列命名,通過這種方法就很容易重新取回
丟失的信息。如果屬性用a t t r _作為前綴,純文本元素使用e l e m _,那么應該能夠很容易區分它們
的不同。我們需要修改規則3,以包括前綴a t t r _:
• 規則3—對于每個屬性節點。
• 創建一個與屬性節點同名的列,使用前綴a t t r _。
• 如果要求屬性,那么列不應該允許為N U L L值。
我們也可以包含下一個規則:
• 規則4—如果一個元素的節點只包含文本,那么在它的父元素表中創建一列,列的名字
與節點一樣,使用前綴e l e m _。
(4) 純文本元素的多發性
盡管把一個純文本元素作為一個字段是一個有用的優化,也存在不能用的情況。當元素可
以顯示一次或多次的時候就是這種情況。如果我們繼續處理模式,可以看到< S t r e e t >元素就只包
含文本,但是它可以在地址的街道部分表示為多行:
程序清單1 0 - 4 5
盡管< S t r e e t >沒有子元素,但是由于它具有多個值,所以不能在關系數據庫用一列來實現。
所以我們需要增加一個表來保存< S t r e e t >的多個值。首先讓我們改一下規則4:
• 規則4—如果一個元素的節點只包含文本,并且最大發生次數為1次,那么在它的父元素
表中創建一列,列的名字與節點一樣,使用前綴e l e m _。
這就意味著我們已經擁有了所有要完成A d d r e s s表的規則—沒有S t r e e t列—看上去將如圖
1 0 - 2 5所示。
然而,在創建S t r e e t表之前還有一個問題。到現在為止,我們創建的用來保存元素信息的所
有表都簡單地與它的父元素相關聯,并可能擁有屬性。然而< S t r e e t >元素沒有屬性但是包含自己
的數據。所以需要在一個表中用一列來保存它。但是因為這個數據不是一個屬性或是一個純文
本的子元素,所以我們無法命名。在一個關系數據庫中,每一列必須有一個名字,所以把它叫
400使用XML 高級編程
下載
做p c d a t a。
圖10-25
現在S t r e e t表將如圖1 0 - 2 6所示。
圖10-26
使用這個表,地址中街道部分的數據可能如圖1 0 - 2 7所示。
圖10-27
在這個例子中有兩個地址,第一個使用了街道記錄為1,2和3,第二個使用4和5。現在需要
修改規則2來處理元素擁有自己文本內容的情況:
• 規則2—對每一個元素節點類型,創建一個與元素相同名字的表,然后:
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(130)