關(guān)系數(shù)據(jù)庫定義的結(jié)構(gòu)非常嚴(yán)格,并且也通過嚴(yán)格的方式維護(hù)軟件應(yīng)用程序的數(shù)據(jù)。Apache 的開源 CouchDB 為儲(chǔ)存數(shù)據(jù)提供一種新方法,即使用不需要模式的面向文檔的數(shù)據(jù)庫模型。與關(guān)系模型高度結(jié)構(gòu)化的數(shù)據(jù)儲(chǔ)存不同,CouchDB 使用基于 JavaScript 的視圖模型生成結(jié)構(gòu)化聚合,以半結(jié)構(gòu)化的方式儲(chǔ)存數(shù)據(jù),并從這些半結(jié)構(gòu)化文檔報(bào)告結(jié)果。CouchDB 一開始是以 Web 應(yīng)用程序?yàn)橹饕繕?biāo)而開發(fā)的,并且希望發(fā)展成為用于開發(fā) Web 應(yīng)用程序的標(biāo)準(zhǔn)數(shù)據(jù)庫。
什么是 CouchDB?
CouchDB 是一個(gè)開源的面向文檔的數(shù)據(jù)庫管理系統(tǒng),可以通過 RESTful JavaScript Object Notation (JSON) API 訪問。術(shù)語 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母縮寫,它反映了 CouchDB 的目標(biāo)具有高度可伸縮性,提供了高可用性和高可靠性,即使運(yùn)行在容易出現(xiàn)故障的硬件上也是如此。CouchDB 初是用 C++ 編寫的,但在 2008 年 4 月,這個(gè)項(xiàng)目轉(zhuǎn)移到 Erlang OTP 平臺(tái)進(jìn)行容錯(cuò)測試。
CouchDB 可以安裝在大部分 POSIX 系統(tǒng)上,包括 Linux® 和 Mac OS X。盡管目前還不正式支持 Windows®,但現(xiàn)在已經(jīng)著手編寫 Windows 平臺(tái)的非官方二進(jìn)制安裝程序。CouchDB 可以從源文件安裝,也可以使用包管理器安裝(比如在 Mac OS X 上使用 MacPorts)。
CouchDB 是一個(gè) Apache Software Foundation 開源項(xiàng)目,根據(jù) Apache 許可 V2.0 發(fā)布。這個(gè)開源許可允許在其他軟件中使用這些源代碼,并根據(jù)需要進(jìn)行修改,但前提是遵從版權(quán)需知和免責(zé)聲明。與許多其他開源許可一樣,這個(gè)許可允許用戶根據(jù)需求使用、修改和分發(fā)該軟件。不一定由同一個(gè)許可包含所有修改,因?yàn)槲覀儍H維護(hù)一個(gè) Apache 代碼使用許可需知。
面向文檔的數(shù)據(jù)庫和關(guān)系數(shù)據(jù)庫之間的區(qū)別
對很多人而言,剛接觸面向文檔數(shù)據(jù)庫管理系統(tǒng)這個(gè)概念時(shí)很難理解它,尤其是長期與關(guān)系數(shù)據(jù)庫打交道的人員。這是因?yàn)檫@兩個(gè)模型相似的地方很少。
顧名思義,面向文檔數(shù)據(jù)庫是由一系列自包含的文檔組成的。這意味著相關(guān)文檔的所有數(shù)據(jù)都儲(chǔ)存在該文檔中 — 而不是關(guān)系數(shù)據(jù)庫的關(guān)系表中。事實(shí)上,面向文檔的數(shù)據(jù)庫中根本不存在表、行、列或關(guān)系。這意味著它們是與模式無關(guān)的;不需要在實(shí)際使用數(shù)據(jù)庫之前定義嚴(yán)格的模式。如果某個(gè)文檔需要添加一個(gè)新字段,它僅需包含該字段,從而不影響到數(shù)據(jù)庫中的其他文檔。因此,文檔不必為沒有值的字段儲(chǔ)存空數(shù)據(jù)值。
即將推出的書 CouchDB: The Definitive Guide(見 參考資料)使用名片作為 “現(xiàn)實(shí)的文檔”,并介紹了與關(guān)系數(shù)據(jù)庫相比,如何在面向文檔的數(shù)據(jù)庫中描述它。在關(guān)系數(shù)據(jù)庫中,您需要使用 4 個(gè)以上的表來儲(chǔ)存這些數(shù)據(jù):一個(gè) “Person” 表、一個(gè) “Company” 表、一個(gè) “Contact Details” 表和一個(gè)用于儲(chǔ)存名片本身的表。這些表都有嚴(yán)格定義的列和鍵,并且使用一系列的連接(join)組裝數(shù)據(jù)。
雖然這樣做的優(yōu)勢是每段數(shù)據(jù)都有一個(gè)惟一真實(shí)的版本,但這為以后的修改帶來不便。此外,也不能修改其中的記錄以用于不同的環(huán)境。例如,一個(gè)人可能有傳真號(hào)碼,而另一個(gè)人沒有。在名片上不應(yīng)該顯示 “傳真:沒有”,而是忽略任何關(guān)于傳真的細(xì)節(jié)。
在面向文檔的數(shù)據(jù)庫中,每個(gè)名片都儲(chǔ)存在各自的文檔中,并且每個(gè)文檔都可以定義它需要使用的字段。因此,對于沒有傳真號(hào)碼的人而言,不需要定義傳真的值,而對于有傳真號(hào)碼的人,則根據(jù)他們的意愿定義該值。
這兩種數(shù)據(jù)庫的另一個(gè)不同點(diǎn)是惟一標(biāo)識(shí)符的儲(chǔ)存。在關(guān)系數(shù)據(jù)庫中通?梢允褂弥麈I,它由一個(gè)自動(dòng)遞增特性或序列生成器生成。當(dāng)然,這些標(biāo)識(shí)符僅相對于所使用的表或數(shù)據(jù)庫是惟一的 — 其他表或數(shù)據(jù)庫還可以使用它們。如果同時(shí)對不同網(wǎng)絡(luò)上的兩個(gè)數(shù)據(jù)庫執(zhí)行更新操作,這兩個(gè)數(shù)據(jù)庫不會(huì)同時(shí)準(zhǔn)確地獲取下一個(gè)惟一標(biāo)識(shí)符。CouchDB 沒有自動(dòng)遞增或序列特性。相反,它為每個(gè)文檔分配一個(gè)通用惟一標(biāo)識(shí)符(Universally Unique Identifier,UUID),這杜絕了其他數(shù)據(jù)庫意外地選擇相同的惟一標(biāo)識(shí)符的情況。
面向文檔數(shù)據(jù)庫和關(guān)系數(shù)據(jù)庫的另一個(gè)重要區(qū)別是面向文檔數(shù)據(jù)庫不支持連接。因此 CouchDB 中沒有主鍵和外鍵,沒有基于連接的鍵。這并不意味著不能從 CouchDB 數(shù)據(jù)庫獲取一組關(guān)系數(shù)據(jù)。一個(gè)稱為視圖的特性允許您為沒有在數(shù)據(jù)庫中定義的文檔創(chuàng)建一種任意關(guān)系。這意味著您能夠獲得典型的 SQL 聯(lián)合查詢的所有好處,但又不需要在數(shù)據(jù)庫層預(yù)定義它們的關(guān)系。
一定要注意,雖然面向文檔數(shù)據(jù)庫的操作方式不同于關(guān)系數(shù)據(jù)庫,但這并不意味著它們是可以替換的。CouchDB 的目的并不是替換關(guān)系數(shù)據(jù)庫,而是為那些更適合使用面向文檔模型(而不是傳統(tǒng)的關(guān)系數(shù)據(jù)模型)的項(xiàng)目提供一種選擇,比如 wikis、博客和文檔管理系統(tǒng)。