日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

xml与数据库略解

發(fā)布時(shí)間:2023/12/13 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xml与数据库略解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?1.0?簡(jiǎn)介
?????
?????
?????本論文簡(jiǎn)要的探討了XML和數(shù)據(jù)庫(kù)之間的關(guān)系,同時(shí)列出一些可以使用數(shù)據(jù)庫(kù)處理XML文檔的軟件。雖然這里不打算詳盡地介紹這些軟件,但是筆者希望它能夠描述使用數(shù)據(jù)庫(kù)處理XML文檔中的主要部分。這里有點(diǎn)偏向與關(guān)系數(shù)據(jù)庫(kù),因?yàn)槲业慕?jīng)驗(yàn)如此。
?????
?????
?????
?????2.0?XML是數(shù)據(jù)庫(kù)嗎?
?????
?????
????? 在開始討論XML和數(shù)據(jù)庫(kù)之前,我們需要回答一個(gè)縈繞在很多心頭的問題:?"XML是數(shù)據(jù)庫(kù)嗎?"在嚴(yán)格意義上將,如果"XML"是指XML文檔時(shí),答案 是"否"。盡管XML文檔包含了數(shù)據(jù),但是如果沒有其他的軟件來處理這些數(shù)據(jù),它對(duì)于數(shù)據(jù)庫(kù)的意義和其他文本文件沒有什么區(qū)別。
?????
?????
?????
?????如果在更為寬泛一些的意義上將,當(dāng)"XML是指XML文檔以及所有相關(guān)的XML的工具和技術(shù)時(shí),答案則是"是"。?之所以肯定是由于XML提供了許多數(shù)據(jù)庫(kù)中所需要的部分:存儲(chǔ)(XML文檔),結(jié)構(gòu)(DTD,?
?????
?????XML?schema 語(yǔ)言),查詢語(yǔ)言(XQL,?XML-QL,?QUILT等),?編程接口(SAX,?DOM),等等。不過...XML還缺少很多在真實(shí)的數(shù)據(jù)庫(kù)中所必 備的內(nèi)容:?有效的存儲(chǔ)、索引、安全、交易、數(shù)據(jù)完備性、多用戶訪問、觸發(fā)、多文檔查詢等。
?????
?????
?????
????? 因此如果在數(shù)據(jù)量一般、用戶較少、性能要求不高的環(huán)境下可以把XML當(dāng)作數(shù)據(jù)庫(kù)來使用;而在大多產(chǎn)品的環(huán)境中,要求有許多的用戶使用、需要嚴(yán)格的數(shù)據(jù)完整 性并且對(duì)性能有很高的要求,XML就不能勝任了。而且,考慮到象dBase和Access等數(shù)據(jù)庫(kù)既便宜又十分易用,因此甚至在第一種情況下XML都很少 有理由充當(dāng)數(shù)據(jù)庫(kù)的角色。
?????
??????3.0?為什么使用數(shù)據(jù)庫(kù)?
?????
?????當(dāng)在考慮使用XML和 數(shù)據(jù)庫(kù)時(shí),第一個(gè)要問自己的問題應(yīng)該是:為什么我需要使用數(shù)據(jù)庫(kù)?你需要將原有的數(shù)據(jù)導(dǎo)出?你需要保存你的Web主頁(yè)?你是要在一個(gè)電子商務(wù)應(yīng)用中使用數(shù) 據(jù)庫(kù),而且其中XML當(dāng)做傳輸?shù)臄?shù)據(jù)格式?這些問題的答案都將直接影響到你對(duì)數(shù)據(jù)庫(kù)和中間件(如果有的話)的選擇。
?????
????? 例如,假設(shè)你在電子商務(wù)應(yīng)用程序中使用XML來進(jìn)行數(shù)據(jù)傳輸。這是很好的方案,因?yàn)槟愕臄?shù)據(jù)具有高度規(guī)范的結(jié)構(gòu),而XML中的那些實(shí)體和編碼對(duì)你而言并不 重要了。畢竟樣你關(guān)心的僅僅是數(shù)據(jù)而不在于這些數(shù)據(jù)如何在文檔中進(jìn)行物理的存儲(chǔ)。如果你的應(yīng)用程序相對(duì)比較簡(jiǎn)單的話,關(guān)系數(shù)據(jù)庫(kù)和數(shù)據(jù)傳輸中間件將可以滿 足你的需求;如果應(yīng)用程序龐大而且復(fù)雜,那么你就需要一個(gè)完全支持XML的開發(fā)環(huán)境了。
?????
?????從另一方面來說,假設(shè)你有一 個(gè)從零散的XML文件創(chuàng)建的網(wǎng)站。你不僅需要管理這個(gè)網(wǎng)站,你還要提供方法讓用戶可以查詢其中的內(nèi)容。這時(shí)你的文件將非常的不規(guī)范,而實(shí)體的使用對(duì)你來說 將變得很重要,因?yàn)檫@些文件的結(jié)構(gòu)是網(wǎng)站的根本。在這個(gè)例子中,你就需要某類"原生?
?????
?????XML"數(shù)據(jù)庫(kù)可以執(zhí)行版本化、跟蹤實(shí)體的使用并且支持如XQL這樣的查詢語(yǔ)言。
?????
?????4.0?數(shù)據(jù)和文檔的對(duì)比
?????
????? 筆者認(rèn)為,在選擇數(shù)據(jù)庫(kù)時(shí),最重要的判斷因素可能是你是利用數(shù)據(jù)庫(kù)來保存數(shù)據(jù)還是保存文檔。如果你想保存數(shù)據(jù),你需要的數(shù)據(jù)庫(kù)主要是面向數(shù)據(jù)存儲(chǔ)(例如關(guān) 系型數(shù)據(jù)庫(kù)或者面向?qū)ο笮蛿?shù)據(jù)庫(kù))以及在數(shù)據(jù)庫(kù)和XML文檔之間相互轉(zhuǎn)換。從另一個(gè)角度來將,如果你想存儲(chǔ)文檔,你需要一個(gè)專門設(shè)計(jì)用來存儲(chǔ)文件的內(nèi)容管 理系統(tǒng)。

?????雖然你可以自己把文件保存在關(guān)系數(shù)據(jù)庫(kù)或面向?qū)ο髷?shù)據(jù)庫(kù)中,可是你常會(huì)發(fā)現(xiàn)你的工作是在重復(fù)內(nèi)容管理系統(tǒng)的功能。類似的,雖然一個(gè)內(nèi)容管理系統(tǒng)通常是建立在面向?qū)ο髷?shù)據(jù)庫(kù)或關(guān)系數(shù)據(jù)庫(kù)之上,但要是把一個(gè)內(nèi)容管理系統(tǒng)當(dāng)做數(shù)據(jù)庫(kù)來使用就可能非常的令人困繞。

?????你需要存儲(chǔ)數(shù)據(jù)還是文檔,答案常常取決于你的XML文檔。原因是XML文件分為兩大類:以數(shù)據(jù)為中心和以文檔為中心。.
?
?????4.1?以數(shù)據(jù)為中心的文件
??
????? 以數(shù)據(jù)為中心的文件的特點(diǎn)是結(jié)構(gòu)相當(dāng)規(guī)范、數(shù)據(jù)顆粒度好(也就是說,數(shù)據(jù)中最小的獨(dú)立單元是PCDATA元素或者是屬性)、很少或者沒有混合內(nèi)容。其中同 層次元素和PCDATA的出現(xiàn)順序并不重要。典型的例子是,XML文檔包含了銷售定單、飛行安排、餐館菜單等等。數(shù)據(jù)為中心的文檔常被用于機(jī)器的使用,這 時(shí)XML可能是多余的---它僅僅是數(shù)據(jù)傳輸?shù)氖侄味选?br />?????
?????例如,下面的銷售定單的文檔就是以數(shù)據(jù)為中心的:
?????
?????ABC?Industries
?????123?Main?St.
?????Chicago
?????IL
?????60609
?????
?????981215
?????

?????????? 在XML的世界中,許多內(nèi)容豐富的文檔實(shí)際上都是數(shù)據(jù)為中心的。我們以顯示圖書信息的Amazon.com網(wǎng)站為例。雖然這個(gè)頁(yè)面是相當(dāng)巨大的文本,但是 這個(gè)文本的結(jié)構(gòu)是高度規(guī)范的,其中許多的部分對(duì)任何的書本描述頁(yè)面都是相同的,并且特點(diǎn)頁(yè)面中的各部分的大小都是有限的。也就是說,該頁(yè)面可以通過一個(gè)簡(jiǎn) 單的、數(shù)據(jù)為中心的XML文檔來建立,其中包含了從數(shù)據(jù)庫(kù)中檢索得到的文本信息以及一個(gè)XSL樣式表。通常,目前任何通過在模板中填充數(shù)據(jù)庫(kù)數(shù)據(jù)而動(dòng)態(tài)構(gòu) 造HTML頁(yè)面的網(wǎng)站都可以被上面介紹的用以數(shù)據(jù)為中心的XML文檔和一個(gè)或者多個(gè)的XSL樣式表方式替代。

?????例如,我們來看下面的租房(Lease)文檔:

?????ABC?Industries?agrees?to?lease?the?property?at
?????123?Main?St.,?Chicago,?IL?from?XYZ
?????Properties?for?a?term?of?not?less?than?TimeUnit="Months">18?at?a?cost?of?Currency="USD"?TimeUnit="Months">1000.
?
?????可以從下面的XML文檔和簡(jiǎn)單的樣式表得到:
?????
?????
?????ABC?Industries
?????????? 以文檔為中心的文檔的特點(diǎn)是:結(jié)構(gòu)不規(guī)范、數(shù)據(jù)顆粒度更大(即,最小的獨(dú)立數(shù)據(jù)單元是包含有混合內(nèi)容的元素或者就是整個(gè)XML文檔)以及含有大量的混合內(nèi) 容。其中相同層次的元素和PCDATA出現(xiàn)順序是非常重要的。典型的例子是書、電子郵件、廣告以及大多數(shù)XHTML文檔。以文檔為中心的文檔是用于人的使 用。
?????

?????
?????例如,下面的產(chǎn)品描述文檔就是以文檔為中心:?

?????Turkey?Wrench
?????
?????Full?Fabrication?Labs,?Inc.
?????
?????Like?a?monkey?wrench,?but?not?as?big.
?????

?????The?turkey?wrench,?which?comes?in?both?right-?and
?????left-handed?versions?(skyhook?optional),?is?made?of?the?finest
?????stainless?steel.?The?Readi-grip?rubberized?handle?quickly?adapts
?????to?your?hands,?even?in?the?greasiest?situations.?Adjustment?is
?????possible?through?a?variety?of?custom?dials.
?????
?????You?can:
?????
?????
?????Order?your?own?turkey?wrench
?????Read?more?about?wrenches
?????Download?the?catalog
?????
?????
?????The?turkey?wrench?costs?just?$19.99?and,?if?you
?????order?now,?comes?with?a?hand-crafted?shrimp?hammer?as?a
?????bonus?gift.
?????

?????4.3?數(shù)據(jù)、文檔和數(shù)據(jù)庫(kù)
?????
????? 在現(xiàn)實(shí)情況中,以數(shù)據(jù)為中心的文件和文檔為中心的文件之間的區(qū)別并不是很嚴(yán)格。例如,一個(gè)以數(shù)據(jù)為中心的文件(如一張發(fā)票),也有可能包含粗顆粒度、不規(guī) 則的數(shù)據(jù)(如發(fā)票的描述部分)。而一個(gè)以文檔為中心文件(如用戶手冊(cè))也可能包含有良好顆粒度、規(guī)則的結(jié)構(gòu)化數(shù)據(jù)(通常是元數(shù)據(jù)),例如作者和修訂日期。 除此之外,讓你的文檔具有以數(shù)據(jù)為中心或者以文檔為中心的特點(diǎn)有助于你判斷是關(guān)心數(shù)據(jù)還是文檔,這也將決定你需要采用什么樣的系統(tǒng)。

????? 要存儲(chǔ)或檢索數(shù)據(jù),你可以使用一個(gè)數(shù)據(jù)庫(kù)(通常是關(guān)系型、面向?qū)ο笮突蛘呤菍哟涡?和中間件(字帶或者是采用第三方),你也可以使用XML服務(wù)器(即創(chuàng)建 分布式應(yīng)用的平臺(tái),例如利用XML進(jìn)行數(shù)據(jù)傳輸?shù)碾娮由虅?wù)應(yīng)用)。要保存文檔,你將需要一個(gè)內(nèi)容管理系統(tǒng)或者是一致性的DOM實(shí)現(xiàn)系統(tǒng)。有關(guān)各類系統(tǒng)的探 討在5.0?
?????
?????"存儲(chǔ)和檢索數(shù)據(jù)"?小節(jié)和6.0?"
?????
?????href="#storingretrievingdocs">存儲(chǔ)和檢索文檔?"?小節(jié)。你也能夠在?
?????
?????href="http://www.rpbourret.com/xml/XMLDatabaseProds.htm">?
?????
?????XML數(shù)據(jù)庫(kù)產(chǎn)品?中了解詳細(xì)的相關(guān)產(chǎn)品列表。
?????
?????
?????
?????5.0?存儲(chǔ)和檢索數(shù)據(jù)

????? 在以數(shù)據(jù)為中心的文檔中的數(shù)據(jù)內(nèi)容可能來自數(shù)據(jù)庫(kù)(此時(shí)你想把數(shù)據(jù)導(dǎo)出為XML格式),也可能是XML文檔(此時(shí)你想把數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中)。前者的例子 是在關(guān)系型數(shù)據(jù)庫(kù)中存儲(chǔ)的大量現(xiàn)有數(shù)據(jù)(或稱遺產(chǎn)數(shù)據(jù));后者的例子是將數(shù)據(jù)作為XML發(fā)布在Web中,而且你想要在你的數(shù)據(jù)庫(kù)中進(jìn)行存儲(chǔ)以進(jìn)行更多的處 理。如此,根據(jù)你的需求,你可能需要將XML文檔轉(zhuǎn)移到數(shù)據(jù)庫(kù)的軟件,也可能需要從數(shù)據(jù)庫(kù)轉(zhuǎn)移到XML文檔的軟件,或者兩者都支持。
?????

?????5.1?轉(zhuǎn)移數(shù)據(jù)

????? 將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中時(shí),經(jīng)常需要丟棄大量與文檔有關(guān)的信息,例如文檔名稱和DTD,同時(shí)還有其物理結(jié)構(gòu),例如實(shí)體的定義和使用、屬性值和同層元素的順 序、二進(jìn)制數(shù)據(jù)的存儲(chǔ)方式(是Base64編碼、是未析實(shí)體或他方式)、字符數(shù)據(jù)段和其他的編碼信息。類似的,當(dāng)從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)時(shí),生成的XML文檔 結(jié)果除了非預(yù)定義實(shí)體lt(<"),gt(">"),?amp("&"),?apos("’"),?quot(""")不包含任何 CDATA或?qū)嶓w引用。而同層元素和屬性的出現(xiàn)順序也常常就是從數(shù)據(jù)庫(kù)中返回的數(shù)據(jù)的次序。
?????

?????盡管一開始有些 讓你吃驚,但是這常常是合理的。例如,假設(shè)你需要用XML作為數(shù)據(jù)格式把一張銷售從一個(gè)數(shù)據(jù)庫(kù)中轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫(kù)中。在這種情況下,在XML文檔中并不 關(guān)心銷售單的編號(hào)是保存在銷售單的日期的前面還是后面,也不用關(guān)心是否將顧客的名稱保存在字符數(shù)據(jù)(CDATA)段還是作為一個(gè)外部實(shí)體,或者直接當(dāng)成一 個(gè)PCDATA。最重要的在于相關(guān)的數(shù)據(jù)是從第一個(gè)數(shù)據(jù)庫(kù)轉(zhuǎn)移到第二個(gè)數(shù)據(jù)庫(kù)中。這樣,這個(gè)數(shù)據(jù)傳輸軟件就需要考慮數(shù)據(jù)的層次結(jié)構(gòu)(該結(jié)構(gòu)將銷售單的有關(guān) 進(jìn)行進(jìn)行了分組),而其他則不必過多考慮。?
?????

?????忽略文檔信息以及其物理結(jié)構(gòu)的后果之一是?
?????
?????文檔的"逆反回歸"的不一致效應(yīng),即將一個(gè)文檔的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,然后根據(jù)這些數(shù)據(jù)重新組織成新的文檔。而即便是根據(jù)標(biāo)準(zhǔn)格式處理,得到的也常常是和前面不同的文檔。這是否可以接受要取決于你的需求,而且也將影響到你對(duì)數(shù)據(jù)庫(kù)和數(shù)據(jù)傳輸中間件的選擇。
?????

?????5.2?
?????
?????從文檔結(jié)構(gòu)到數(shù)據(jù)庫(kù)結(jié)構(gòu)的映射

?????
?????
?????為了在XML和數(shù)據(jù)庫(kù)之間傳輸數(shù)據(jù),需要在文檔結(jié)構(gòu)和數(shù)據(jù)庫(kù)結(jié)構(gòu)之間進(jìn)行相互的映射。這樣的映射通常分為兩大類:?模板驅(qū)動(dòng)和模式驅(qū)動(dòng)。

?????????? 這種以模板驅(qū)動(dòng)的映射可以相當(dāng)?shù)撵`活。例如,有些產(chǎn)品可以允許你在任何結(jié)果集合中替換你想要的內(nèi)容(包括在SELECT中使用參數(shù)),而不是象上面的例子 中簡(jiǎn)單地格式化結(jié)果。另外它還支持使用編程來進(jìn)行構(gòu)造,例如循環(huán)和條件判斷結(jié)構(gòu)。還有一些還支持SELECT語(yǔ)句的參數(shù)化,例如通過HTTP來傳遞參數(shù)。 ?
?????
?????
?????目前,以模板驅(qū)動(dòng)的映射只支持從一個(gè)關(guān)系型數(shù)據(jù)庫(kù)轉(zhuǎn)換成XML文檔的情況。
??
?????
?????5.2.2?模型驅(qū)動(dòng)的映射
?????
?????
????? 在以模型驅(qū)動(dòng)的映射中,利用XML文檔結(jié)構(gòu)對(duì)應(yīng)的數(shù)據(jù)模型顯式或隱式地將映射成數(shù)據(jù)庫(kù)的結(jié)構(gòu),而且反之亦然。它的缺點(diǎn)是靈活性不夠,但是卻簡(jiǎn)單易用,這是 因?yàn)樗腔诰唧w的數(shù)據(jù)模型來進(jìn)行映射的,通常能夠?yàn)橛脩魧?shí)現(xiàn)很多地轉(zhuǎn)換工作。由于將數(shù)據(jù)從數(shù)據(jù)庫(kù)轉(zhuǎn)換成XML的結(jié)果依照了單個(gè)模型,?
?????
?????因此通常在這種方式下通常結(jié)合XSL來提供模板驅(qū)動(dòng)的系統(tǒng)中所具有的靈活性。

?????在XML文檔中的數(shù)據(jù)視圖通常有兩種模型:表格模型和特定數(shù)據(jù)對(duì)象模型。有時(shí)候也可能會(huì)出現(xiàn)其他的模型。例如,通過采用ID和IDREF屬性,一個(gè)XML文檔可以用來一個(gè)指定的圖形。不過,很多現(xiàn)有的中間件并不支持這些模型。
???
?????5.2.2.1?表格模型

?????許多中間件軟件包都采用表格模型在XML和關(guān)系型數(shù)據(jù)庫(kù)之間進(jìn)行轉(zhuǎn)換。它把XML的模型看成是一個(gè)單獨(dú)的表格或者是一系列的表格。也就是說,XML的文檔的結(jié)構(gòu)和下面的例子相類似,其中在單個(gè)表格的情況下,<database>并不出現(xiàn):
?
?????<database>
?????<table>
?????<row>
?????<column1>...</column1>
?????<column2>...</column2>
?????...
?????</row>
?????...
?????</table>
?????...
?????</database>
??
????? 其中的術(shù)語(yǔ)"table"可理解為單個(gè)的結(jié)果集(當(dāng)從數(shù)據(jù)庫(kù)向XML中轉(zhuǎn)換數(shù)據(jù)時(shí)),或者是一個(gè)單獨(dú)的表格或可更新的視圖(當(dāng)從XML向數(shù)據(jù)庫(kù)轉(zhuǎn)換數(shù)據(jù) 時(shí))。如果數(shù)據(jù)需要來自多個(gè)結(jié)果集(當(dāng)數(shù)據(jù)來自數(shù)據(jù)庫(kù)中時(shí))或者與僅僅表達(dá)成一系列表格的集合(當(dāng)轉(zhuǎn)換數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí))相比,XML的文檔包含有更深層次 的嵌套元素,那么類似的轉(zhuǎn)換幾乎是不可能的。

?????5.2.2.2?特定數(shù)據(jù)對(duì)象模型
?
?????XML文檔中第二種普遍的數(shù)據(jù)模型是特定數(shù)據(jù)對(duì)象的樹型結(jié)構(gòu)。在該模型中,元素類型通常對(duì)應(yīng)對(duì)象,而XML中的內(nèi)容模型、屬性和PCDATA則對(duì)應(yīng)對(duì)象的屬性。這種模型直接映射成面向?qū)ο蟮臄?shù)據(jù)庫(kù)和層次型數(shù)據(jù)庫(kù),當(dāng)然借助于傳統(tǒng)的對(duì)象-關(guān)系映射技術(shù)和SQL?
?????
?????3對(duì)象視圖也可以映射成關(guān)系數(shù)據(jù)庫(kù)。要注意的是,這種模型并不是文檔對(duì)象模型(DOM)。DOM是對(duì)文檔本身進(jìn)行建模,而不是對(duì)文檔中的數(shù)據(jù)。如
?????
?????href="#writeyourown">6.1.2小節(jié)所述,DOM用來在關(guān)系型數(shù)據(jù)庫(kù)的基礎(chǔ)上建立內(nèi)容管理系統(tǒng)。
?
?????例如,上面的銷售定單文檔就可以看作是由五個(gè)類所組成的樹型結(jié)構(gòu)。如下面的視圖所示,包括Orders,?SalesOrder,?Customer,?
?????
?????Line和Part類:
?????
?????Orders
?????|
?????SalesOrder
?????/?|?Customer?Line?Line
?????|?|
?????Part?Part
??
????? 當(dāng)把一個(gè)XML文檔建模為一棵特定數(shù)據(jù)對(duì)象樹時(shí),就沒有必要要求元素一定要對(duì)應(yīng)于對(duì)象。例如,如果一個(gè)元素只包含PCDATA,如銷售定單文檔中的 CustName元素,它可以當(dāng)作一個(gè)屬性進(jìn)行處理,因此屬性只包含單一的、標(biāo)量型數(shù)值。類似的,有時(shí)將混合元素或元素內(nèi)容模型化成屬性也是非常有用的。 一個(gè)現(xiàn)成的例子就是在銷售定單文檔中對(duì)Description元素的處理:盡管它在XHTML的格式中有混合內(nèi)容,但是將Description元素看作 單個(gè)的屬性會(huì)更有用些,因?yàn)樗慕M成部分本身并沒有什么意義。
????
?????5.3?數(shù)據(jù)類型、空值、字符集合和其它
?
?????本節(jié)將探討一些有關(guān)來自數(shù)據(jù)庫(kù)的XML文檔的存儲(chǔ)問題。通常,你決定不了你選擇的中間件是如何解決這些問題的,但是你最好應(yīng)該意識(shí)到這些問題的存在,因?yàn)檫@有助于你正確選擇你的中間件。

?????5.3.1?數(shù)據(jù)類型
?????
?????
?????XML 不支持任何有實(shí)際意義的數(shù)據(jù)類型。除了未析實(shí)體,所有XML文檔中的數(shù)據(jù)都被當(dāng)成文本來對(duì)待,即便它能夠用其他的數(shù)據(jù)類型(如日期或者整數(shù))來表示。通 常,數(shù)據(jù)轉(zhuǎn)換中間件將把XML文檔中的文本轉(zhuǎn)換成其它數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型,反之亦然。然而,特定的數(shù)據(jù)類型所識(shí)別的文本格式是有限制的,例如受到提供的 JDBC?
?????
?????Driver所支持的數(shù)據(jù)類型的限制。在這些眾多的數(shù)據(jù)類型中,日期類型通常會(huì)導(dǎo)致麻煩。不同國(guó)際地區(qū)的數(shù)字格式的差異也可能產(chǎn)生問題。

?????5.3.2?二進(jìn)制數(shù)據(jù)
?????
?????
?????通常有兩種方法將二進(jìn)制數(shù)據(jù)保存到XML文檔中的:未析實(shí)體和Base64編碼處理(一種MIME編碼方法,可以將二進(jìn)制數(shù)據(jù)映射成US-ASCII的子集)。?
?????
?????對(duì)于關(guān)系型數(shù)據(jù)庫(kù),這兩種方法都可能存在問題,因?yàn)閺臄?shù)據(jù)庫(kù)中保存和檢索二進(jìn)制數(shù)據(jù)的規(guī)則非常的嚴(yán)格,這樣對(duì)會(huì)導(dǎo)致中間件出現(xiàn)問題。
?
????? 另外,并沒有一種標(biāo)準(zhǔn)的符號(hào)用來說明一個(gè)XML文檔中的元素包含有Base64編碼數(shù)據(jù),從而使得中間件可能根本就不能夠識(shí)別這種編碼。最后,在存儲(chǔ)數(shù)據(jù) 到數(shù)據(jù)庫(kù)時(shí),可能會(huì)忽略與未析實(shí)體或Base64編碼元素相關(guān)的符號(hào)。所以,如果對(duì)你而言二進(jìn)制數(shù)據(jù)非常重要的話,請(qǐng)務(wù)必要確認(rèn)你的中間件是否支持二進(jìn)制 數(shù)據(jù)。

?????5.3.3?空值
?????
?????
?????在數(shù)據(jù)庫(kù)世界中,空值(null)數(shù)據(jù)意味著數(shù)據(jù)不存在值。但是這與一個(gè)值為0的數(shù)字或長(zhǎng)度為0的字符串有很大的區(qū)別。例如,假設(shè)你的數(shù)據(jù)來自一個(gè)氣象站,?
?????
?????如果氣象站的溫度計(jì)出了毛病讀不出溫度值,那么你的數(shù)據(jù)庫(kù)中將存儲(chǔ)一個(gè)null值而不是一個(gè)0。顯然,值為0完全是另外一回事了?
?????
?????XML中空值概念的支持可以通過設(shè)置可選的元素類型或?qū)傩詠韺?shí)現(xiàn)。如果元素類型或?qū)傩灾禐閚ull,XML只要在文檔不包含該元素或者屬性就可以了。但是對(duì)數(shù)據(jù)庫(kù)而言,空的元素或包含0長(zhǎng)度字符串的屬性并不是空值null:它們的值為長(zhǎng)度為0的字符串。

?????當(dāng)在XML文檔和數(shù)據(jù)庫(kù)結(jié)構(gòu)之間相互映射過程中,你必須特別注意那些可選的元素類型或?qū)傩允欠駥?duì)應(yīng)于數(shù)據(jù)庫(kù)中的空值項(xiàng)。如果不這么做的話,很可能出現(xiàn)插入錯(cuò)誤(當(dāng)將數(shù)據(jù)轉(zhuǎn)換到數(shù)據(jù)庫(kù)中時(shí))或者無效文檔錯(cuò)誤(當(dāng)將數(shù)據(jù)從數(shù)據(jù)庫(kù)讀出時(shí))。
???
?????因?yàn)橥瑯右梅?hào)空值,XML中相對(duì)與數(shù)據(jù)庫(kù)而言更為靈活。具體來講,許多XML用戶很可能包含空字符串的空元素或?qū)傩允强罩怠_@個(gè)時(shí)候你必須考慮如何選擇合適的中間件來解決這個(gè)問題。一些中間件可以讓用戶選擇在XML文檔中定義用什么來組成空值。
??
?????5.3.4?字符集
???
????? 根據(jù)定義,除了一些控制字符,XML文檔能夠包含任何的Unicode字符。但是不幸的是,許多數(shù)據(jù)庫(kù)都限制或則不支持Unicode,而且需要一些特殊 的配置才能夠處理非ASCII編碼的字符數(shù)據(jù)。如果你的數(shù)據(jù)包含了非ASCII字符,那么務(wù)必要核實(shí)你的數(shù)據(jù)庫(kù)和中間件是否能夠處理這些字符。

?????5.3.5?處理指令
?
????? 處理指令并不屬于XML文檔中的“數(shù)據(jù)”部分,因此目前許多中間件可能不能正常的處理。問題是,尤其是在將XML文檔結(jié)構(gòu)嚴(yán)格映射成數(shù)據(jù)庫(kù)結(jié)構(gòu)時(shí),處理指 令通常是很難處理的,因?yàn)樗鼈兛梢蕴摂M地出現(xiàn)在文檔的任何位置。因此,中間件就很難判斷將它們保存到什么位置以及在什么時(shí)候檢索讀取出來。如果處理指令和 文檔的循環(huán)回復(fù)("round-tripping")對(duì)你而言是非常重要的話,就務(wù)必檢查你的中間件是如解決這個(gè)問題的。

?????5.3.6?存儲(chǔ)標(biāo)記
?????
?????
?????在
?????
?????href="#markup">4
?????
?????href="#markup">.2.2?
?????
????? 小節(jié)中提到,有時(shí)候?qū)鼗蛘呋旌蟽?nèi)容的元素不作進(jìn)一步的解析而直接保存到數(shù)據(jù)庫(kù)中是非常有用的。最常見的方法是簡(jiǎn)單的把這個(gè)標(biāo)記本身直接保存到數(shù)據(jù) 庫(kù)中。不幸的是,當(dāng)從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)時(shí)將產(chǎn)生問題:不可能判斷數(shù)據(jù)庫(kù)中的標(biāo)記到底是真的標(biāo)記還是代表了標(biāo)記字符的實(shí)體,如由lt和gt轉(zhuǎn)義的字符。

?????例如,下面的description元素:
?
?????<description>
?????<b>Confusing?example:</b>?<foo/>
?????</description>
??
?????在數(shù)據(jù)庫(kù)中存儲(chǔ)為:
?????
?????<b>Confusing?example:</b>?<foo/>
?
????? 這時(shí)數(shù)據(jù)庫(kù)就不能判斷<b>和<foo>是標(biāo)記還是文本。有幾種可能的解決方法,如以一定的方式來標(biāo)志標(biāo)記或者對(duì)非標(biāo)記的標(biāo)記字 符使用實(shí)體。但是這時(shí)你要格外注意這樣的方式是否和使用這些的數(shù)據(jù)的其它應(yīng)用兼容。例如,如果你想查詢數(shù)據(jù)庫(kù)中的小于號(hào)("<")和?
?????
?????lt實(shí)體("<")時(shí)就要特別留心。

?????5.4?從數(shù)據(jù)庫(kù)的結(jié)構(gòu)生成DTD及其互逆過程
????
?????在XML文檔和數(shù)據(jù)庫(kù)之間轉(zhuǎn)換數(shù)據(jù)時(shí),一個(gè)普遍問題是:如何從數(shù)據(jù)庫(kù)的結(jié)構(gòu)(Schema)生成XML的DTD,如果從XML的DTD產(chǎn)生數(shù)據(jù)庫(kù)的結(jié)構(gòu)。簡(jiǎn)而言之,這是非常直接的操作,但是產(chǎn)生的結(jié)果通常離許多用戶的期望值還有一些距離。
?
?????(還要注意這通常是一次性操作,而大多數(shù)應(yīng)用,尤其是所有的垂直性應(yīng)用都結(jié)合了已知的DTD和關(guān)系型Schema的集合。顯而易見的特例是在關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)隨機(jī)XML文檔或者將關(guān)系型數(shù)據(jù)發(fā)布為XML文檔的工具;而在后面的情況中,DTD的作用并不明顯。)
????
?????對(duì)于元素類型中每個(gè)有單一數(shù)值的屬性和只包含有PCDATA內(nèi)容的子元素類型在該ta?
?????
?????ble中新建立一列(字段)。如果子元素類型或則屬性是可選的,讓該字段允許為空。?
?????
?????對(duì)于每個(gè)有多值的屬性或則多僅含有PCDATA內(nèi)容的子元素類型,再建立一個(gè)分開的?
?????
?????table來保存他們的值,通過它們的父表的主關(guān)鍵字連接到父表。?
?????
?????對(duì)于每個(gè)子元素,這些子元素本身還有元素或則混合內(nèi)容,使用父表中的關(guān)鍵字將?
?????
?????父元素表連接到子元素表中。?
?????
?????而下面則是一個(gè)從關(guān)系數(shù)據(jù)庫(kù)的結(jié)構(gòu)生成XML文檔的過程(簡(jiǎn)化過的):?
?????
?????對(duì)每個(gè)table,新建一個(gè)元素。?
?????
?????對(duì)表中的每列,建立一個(gè)屬性或則只含PCDATA的子元素?
?????
?????對(duì)每個(gè)包含有在主鍵/外鍵關(guān)鍵字關(guān)系中主鍵值的列,新建一個(gè)子元素。

?????例如,下面的過程(經(jīng)簡(jiǎn)化)說明了如何從一個(gè)DTD生成一個(gè)關(guān)系型結(jié)構(gòu):
???
?????對(duì)于每種包含元素或者混合內(nèi)容的元素類型,新建一個(gè)表格和一個(gè)主鍵字段。?
????
?????對(duì)于每個(gè)包含混合內(nèi)容的元素類型,創(chuàng)建一個(gè)單獨(dú)的表格,其中存放未析數(shù)據(jù),通過父元素主鍵鏈接到父表格。?
?
?????對(duì)于此元素類型的每個(gè)單值屬性和只包含未析數(shù)據(jù)內(nèi)容、只出現(xiàn)一次的子元素,在該表格中創(chuàng)建一個(gè)字段。如果元素類型或者屬性是可選的,可以讓設(shè)置該字段為空值。?
?
?????對(duì)于每個(gè)多值屬性和多次出現(xiàn)的子元素,創(chuàng)建一個(gè)單獨(dú)的表格來存儲(chǔ)數(shù)值,并且通過父元素主鍵鏈接到父表格。?
?
?????對(duì)每個(gè)有元素或者混合內(nèi)容的子元素,通過父元素主鍵將父元素表格和子元素表格相連接。?
????
?????下面的過程(經(jīng)簡(jiǎn)化)說明了如何從一個(gè)關(guān)系型的結(jié)構(gòu)生成一個(gè)DTD:

?????對(duì)于每個(gè)表格,新建一個(gè)元素;?

?????對(duì)于表格中的每個(gè)字段,新建一個(gè)屬性或者是只包含未析數(shù)據(jù)的子元素;?

?????對(duì)于每個(gè)表格字段中提供主鍵的主鍵/外鍵的關(guān)系都新建一個(gè)子元素。?

?????不幸的是,這些過程還存在著一些缺陷。例如,DTD中沒有方法預(yù)先準(zhǔn)確地規(guī)定數(shù)據(jù)類型或者字段長(zhǎng)度。

????? 因?yàn)槿魏蔚念A(yù)先定義(例如通過讀取一個(gè)示例文檔)在讀取其它“類型”的文檔或者其他文檔中包含有超過字長(zhǎng)內(nèi)容的文檔時(shí)就會(huì)產(chǎn)生錯(cuò)誤。(長(zhǎng)久之策是使用 XML?schema文檔的數(shù)據(jù)類型。)簡(jiǎn)單來說,當(dāng)從一關(guān)系型結(jié)構(gòu)生成DTD時(shí),是沒有辦法預(yù)先判斷子元素“應(yīng)該”出現(xiàn)的順序或者字段(如數(shù)據(jù)庫(kù)內(nèi)部的 行標(biāo)識(shí))是否該進(jìn)行完全轉(zhuǎn)換。?
?????
?????在以上兩種情況中都可能產(chǎn)生命名的沖突。
???
?????盡管有這樣那樣的缺陷,但是這些方法仍然能夠很好地奠定在關(guān)系型結(jié)構(gòu)和DTD之間互相轉(zhuǎn)換的起點(diǎn)。


轉(zhuǎn)載于:https://www.cnblogs.com/Dragon-China/archive/2007/06/01/767165.html

總結(jié)

以上是生活随笔為你收集整理的xml与数据库略解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。