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