曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
一對多的關系很好。然而,它不允許我們表示在書到作者的假設中所需要的多對多的關系。提
醒一下,我們說過一本書可以有多個作者,并且一個作者可能寫過許多書。為了實現這一點,
需要一個單獨的表,除了我們試圖建立的關系外什么都沒有。
第10章XML和數據庫使用371 下載
讓我們假設有如下的作者表(參見表1 0 - 9):
表1 0 - 9
作者編號名姓簡歷
1 S t e p h e n M o h r ⋯⋯
2 K a t h i e K i n g s l e y - H u g h e s ⋯⋯
3 F r a n k B o u m p h r e y ⋯⋯
注意每一個作者有一個唯一數字—或主鍵—用來標識他們,就像貨幣符號那樣,但是
在這個表中沒有對書的引用。現在,證我們看一下書表(參見表1 0 - 1 0),對于每一本書也有一
個唯一的I D:
表1 0 - 1 0
書籍編號書名I S B N
1 XML Applications 1 - 8 6 1 0 0 1 - 5 2 - 5
2 Designing Distributed Applications with XML, ASP,IE5, LDAP and MSMQ 1 - 8 6 1 0 0 2 - 2 7 - 0
3 Professional Style Sheets for HTML and XML 1 - 8 6 1 0 0 1 - 6 5 - 7
再次注意,就像在作者表中沒有對書表的引用一樣,
這個表也沒有對作者的引用。不像一對一和一對多關系
那樣使用表的額外字段來實現,我們需要建立第三張表,
用來維護多對多的連接。這個額外表參見表1 0 - 11。
這個表只包含了其他兩個表的關系。這個技術可以
被擴展,可以提供需要的更多表的關系。那么我們如何
從數據庫中提取信息呢?為了找到Stephen Mohr所寫的
所有書,我們將使用下面的S Q L語句:
程序清單1 0 - 9
并且,為了找到“XML Applications”這本書的作者,我們使用語句:
程序清單1 0 - 1 0
注意這些查詢將這三個表進行了連接。第一個查詢進行如下工作:
• 匹配B o o k A u t h o r. a u t h o r C i t e I D到A u t h o r. a u t h o r C i t e I D的W H E R E子句部分用來取得在
B o o k A u t h o r表提到的所有作者。
372使用XML 高級編程
下載
表1 0 - 11
B o o k I D a u t h o r C i t e I D
1 1
1 2
1 3
2 1
3 3
• LastName到‘M o h r’的比較部分用來將作者的列表縮小到Stephen Mohr。
• 在兩個B o o k I D字段進行的比較查找S t e p h e n所寫的書。
使用這個連接,我們可以提出關于書和它們到作者的關系的問題。完全的表的配置看上去
如圖1 0 - 8所示。
圖10-8
(6) RDBMS和X M L
讓我們回到這一部分的中心議題上來;對于關系數據庫所給出的這些特性,它們能夠很好
地提供對X M L文檔操作的高級功能嗎?為了解決這個問題,我們需要檢查關系數據庫是如何模
擬節點信息的。
記起我們關于表的討論,可以看到一行可以很容易地表示一個元素,用表的列來保存屬性。
例如,在前面表配置圖中的A u t h o r表很容易保存書目錄的< A u t h o r >元素。
我們知道一些元素也包含文本屬性,但是這個可以使用一個已命名的列進行摸擬,比如
P C D ATA。因為它有一個我們知道的名字,這樣當進行輸出時,不應該以一個屬性被取出而應該
是作為元素。
書的目錄中關于這一點的一個例子是< I m p r i n t >元素,看上去如:
在I m p r i n t表中的數據如圖1 0 - 9表示:
在一個表中將元素映射成元素相當直接,但是只是完成了一半;我們仍然需要表示節點間
的關系。為了做到這一點,我們需要使用與在前面部分所看到的不同類型的連接。我們可以模
擬父親/孩子關系,簡單地通過在表中創建一個外鍵,用它來表示孩子,在表中用主鍵表示父親。
例如,我們剛創建的I m p r i n t表可能被擴展成(參見圖1 0 - 1 0):
其中f k _ I m p r i n t s字段是一個引用—或外鍵—做為父表I m p r i n t s的主鍵。這個表被提出面
向出版商為(參見圖1 0 - 11)。
第10章XML和數據庫使用373 下載
圖10-9
圖10-10
圖10-11
(7) RDBMS的局限
剛看上去好像相當有用;父親和孩子節點的分級表示可以通過設置從子表到父表的一種引
用來建立。然而,這里面有一個主要的問題,父/子關系太嚴格了。例如,用我們剛才提出的方
法,就不可能表示程序清單1 0 - 11所示的結構:
程序清單1 0 - 11
這是因為在類型C的元素與它的父親之間的關系不是固定的;它可能有一個類型A的父親也
可能有一個類型B的父親。如果我們使用剛介紹的簡單的主/外鍵技術,這個X M L結構將只能存
在或者這個父親或者那個父親。換句話說,類型C的元素將有一個到A表或到B表的外鍵,而不
是兩個都有。
所以,盡管R D B M S用它的表結構在相當程度上模擬了節點,但它不能很好地處理這些節點
的關系。盡管這樣說,我們不應該放棄將R D B M S作為存儲X M L節點的機制。有很多的情況用這
類的數據庫將表現得非常充分。實際上,正像我們在后面要看到的,書的目錄的例子工作得很
好,因為這個模式不包括我們才提到的那種情況。
后面,我們將深入介紹如何將一個模式轉化為一系列的表和關系。
(8) 產品
374使用XML 高級編程
下載
盡管R D B M S的安裝庫是很巨大的,但是在這一領域沒有什么能與P O E T或e X c e l o n相比。下
面的產品可能是最先進的。我們列出了比較感興趣的幾個應用。
LivePage Corporation LivePage Enterprise 3.0
L i v e P a g e可以轉化X M L到關系數據庫。它通過在關系數據庫上設置一個軟件層來實現的,
它可以處理轉入和轉出。L i v e P a g e本身不是一個數據庫,但是搭乘在下面其中一個產品的上面:
• IBM DB2 2.1或更新版
• Microsoft SQL Server 6.0或更新版
• Oracle SQL 7或更新版
• Sybase SQL Server 10和11
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(123)