CouchDB 是一個(gè)開(kāi)源的面向文檔的數(shù)據(jù)庫(kù)管理系統(tǒng),可以通過(guò) RESTful ECMAScript Object Notation (JSON) API 訪問(wèn)。術(shù)語(yǔ)“Couch”是“Cluster Of Unreliable 大宗商品 Hardware”的首字母縮寫(xiě),它反映了 CouchDB 的目標(biāo)具有高度可伸縮性,提供了高可用性和高可靠性,即使運(yùn)行在容易出現(xiàn)故障的硬件上也是如此。CouchDB 最初是用 C++ 編寫(xiě)的,但在 2008 年 4 月,這個(gè)項(xiàng)目轉(zhuǎn)移到 Erlang OTP 平臺(tái)進(jìn)行容錯(cuò)測(cè)試
簡(jiǎn)介
CouchDB是用Erlang開(kāi)發(fā)的面向文檔的數(shù)據(jù)庫(kù)系統(tǒng),最近剛剛發(fā)布了1.0版本(2010年7月14日)。CouchDB不是一個(gè)傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),而是面向文檔的數(shù)據(jù)庫(kù),其數(shù)據(jù)存儲(chǔ)方式有點(diǎn)類(lèi)似Lucene的index文件格式,CouchDB最大的意義在于它是一個(gè)面向web應(yīng)用的新一代存儲(chǔ)系統(tǒng),事實(shí)上,CouchDB的口號(hào)就是:下一代的Web應(yīng)用存儲(chǔ)系統(tǒng)。
CouchDB 可以安裝在大部分 POSIX 系統(tǒng)上,包括 Linux? 和 Mac OS X。Version 2.2.0開(kāi)始正式支持Windows (x64)。CouchDB 可以從源文件安裝,也可以使用包管理器安裝(比如在 Mac OS X 上使用 MacPorts)。
CouchDB 是一個(gè)頂級(jí) apache Software Foundation 開(kāi)源項(xiàng)目,根據(jù) Apache 許可 V2.0 發(fā)布。這個(gè)開(kāi)源許可允許在其他軟件中使用這些源代碼,并根據(jù)需要進(jìn)行修改,但前提是遵從版權(quán)需知和免責(zé)聲明。與許多其他開(kāi)源許可一樣,這個(gè)許可允許用戶(hù)根據(jù)需求使用、修改和分發(fā)該軟件。不一定由同一個(gè)許可包含所有修改,因?yàn)槲覀儍H維護(hù)一個(gè) apache 代碼使用許可需知。
特點(diǎn)
一、CouchDB是分布式的數(shù)據(jù)庫(kù),他可以把存儲(chǔ)系統(tǒng)分布到n臺(tái)物理的節(jié)點(diǎn)上面,并且很好的協(xié)調(diào)和同步節(jié)點(diǎn)之間的數(shù)據(jù)讀寫(xiě)一致性。這當(dāng)然也得靠Erlang無(wú)與倫比的并發(fā)特性才能做到。對(duì)于基于web的大規(guī)模應(yīng)用文檔應(yīng)用,分布式可以讓它不必像傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)那樣分庫(kù)拆表,在應(yīng)用代碼層進(jìn)行大量的改動(dòng)。
二、CouchDB是面向文檔的數(shù)據(jù)庫(kù),存儲(chǔ)半結(jié)構(gòu)化的數(shù)據(jù),比較類(lèi)似Lucene的index結(jié)構(gòu),特別適合存儲(chǔ)文檔,因此很適合CMS,電話本,地址本等應(yīng)用,在這些應(yīng)用場(chǎng)合,文檔數(shù)據(jù)庫(kù)要比關(guān)系數(shù)據(jù)庫(kù)更加方便,性能更好。
三、CouchDB支持REST API,可以讓用戶(hù)使用ECMAScript來(lái)操作CouchDB數(shù)據(jù)庫(kù),也可以用JavaScript編寫(xiě)查詢(xún)語(yǔ)句,我們可以想像一下,用AJAX技術(shù)結(jié)合CouchDB開(kāi)發(fā)出來(lái)的CMS系統(tǒng)會(huì)是多么的簡(jiǎn)單和方便。
其實(shí)CouchDB只是Erlang應(yīng)用的冰山一角,在最近幾年,基于Erlang的應(yīng)用也得到的蓬勃的發(fā)展,特別是在基于web的大規(guī)模,分布式應(yīng)用領(lǐng)域,幾乎都是Erlang的優(yōu)勢(shì)項(xiàng)目。
工作原理
CouchDB 構(gòu)建在強(qiáng)大的 B-樹(shù)儲(chǔ)存引擎之上。這種引擎負(fù)責(zé)對(duì) CouchDB 中的數(shù)據(jù)進(jìn)行排序,并提供一種能夠在對(duì)數(shù)均攤時(shí)間內(nèi)執(zhí)行搜索、插入和刪除操作的機(jī)制。CouchDB 將這個(gè)引擎用于所有內(nèi)部數(shù)據(jù)、文檔和視圖。
因?yàn)?CouchDB 數(shù)據(jù)庫(kù)的結(jié)構(gòu)獨(dú)立于模式,所以它依賴(lài)于使用視圖創(chuàng)建文檔之間的任意關(guān)系,以及提供聚合和報(bào)告特性。使用 Map/Reduce 計(jì)算這些視圖的結(jié)果,Map/Reduce 是一種使用分布式計(jì)算來(lái)處理和生成大型數(shù)據(jù)集的模型。Map/Reduce 模型由 谷歌 引入,可分為 Map 和 Reduce 兩個(gè)步驟。在 Map 步驟中,由主節(jié)點(diǎn)接收文檔并將問(wèn)題劃分為多個(gè)子問(wèn)題。然后將這些子問(wèn)題發(fā)布給工作節(jié)點(diǎn),由它處理后再將結(jié)果返回給主節(jié)點(diǎn)。在 Reduce 步驟,主節(jié)點(diǎn)接收來(lái)自工作節(jié)點(diǎn)的結(jié)果并合并它們,以獲得能夠解決最初問(wèn)題的總體結(jié)果和答案。
CouchDB 中的 Map/Reduce 特性生成鍵/值對(duì),CouchDB 將它們插入到 B-樹(shù)引擎中并根據(jù)它們的鍵進(jìn)行排序。這就能通過(guò)鍵進(jìn)行高效查找,并且提高 B-樹(shù)中的操作的性能。此外,這還意味著可以在多個(gè)節(jié)點(diǎn)上對(duì)數(shù)據(jù)進(jìn)行分區(qū),而不需要單獨(dú)查詢(xún)每個(gè)節(jié)點(diǎn)。
傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)有時(shí)使用鎖來(lái)管理并發(fā)性,從而防止其他客戶(hù)機(jī)訪問(wèn)某個(gè)客戶(hù)機(jī)正在更新的數(shù)據(jù)。這就防止多個(gè)客戶(hù)機(jī)同時(shí)更改相同的數(shù)據(jù),但對(duì)于多個(gè)客戶(hù)機(jī)同時(shí)使用一個(gè)系統(tǒng)的情況,數(shù)據(jù)庫(kù)在確定哪個(gè)客戶(hù)機(jī)應(yīng)該接收鎖并維護(hù)鎖隊(duì)列的次序時(shí)會(huì)遇到困難,這很常見(jiàn)。在 CouchDB 中沒(méi)有鎖機(jī)制,它使用的是多版本并發(fā)性控制(Multiversion concurrency controlMVCC)— 它向每個(gè)客戶(hù)機(jī)提供數(shù)據(jù)庫(kù)的最新版本的快照。這意味著在提交事務(wù)之前,其他用戶(hù)不能看到更改。許多現(xiàn)代數(shù)據(jù)庫(kù)開(kāi)始從鎖機(jī)制前移到 MVCC,包括 Oracle數(shù)據(jù)庫(kù)(V7 之后)和 微軟? SQL Server 2005 及更新版本。
使用體驗(yàn)
面向文檔數(shù)據(jù)庫(kù),不需要范式,直接存儲(chǔ)JSON就可以,CouchDB默認(rèn)會(huì)生成 _id,_rev 兩個(gè)鍵,_id是一條記錄(文檔)的唯一標(biāo)識(shí),如果不提供_id,_id會(huì)自動(dòng)生成,也可以手動(dòng)指定_id,比如用手機(jī)號(hào)做主鍵:
{'_id':'+86186*****',name:''}
_rev是其版本號(hào),每更新一次 _rev就會(huì)自動(dòng)發(fā)生變化,格式為
5-6a8617596d2adfea245662df0df611ao
,標(biāo)識(shí)第5個(gè)版本,后面是HASH簽名,可以通過(guò)_rev尋找到所有的歷史版本,所以用來(lái)做需要存儲(chǔ)版本的文檔系統(tǒng)應(yīng)該非常不錯(cuò),比如多人協(xié)作修改一篇文檔等應(yīng)用。
數(shù)據(jù)庫(kù)區(qū)別
面向文檔的數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)之間的區(qū)別
對(duì)很多人而言,剛接觸面向文檔數(shù)據(jù)庫(kù)管理系統(tǒng)這個(gè)概念時(shí)很難理解它,尤其是長(zhǎng)期與關(guān)系數(shù)據(jù)庫(kù)打交道的人員。這是因?yàn)檫@兩個(gè)模型相似的地方很少。
顧名思義,面向文檔數(shù)據(jù)庫(kù)是由一系列自包含的文檔組成的。這意味著相關(guān)文檔的所有數(shù)據(jù)都儲(chǔ)存在該文檔中 — 而不是關(guān)系數(shù)據(jù)庫(kù)的關(guān)系表中。事實(shí)上,面向文檔的數(shù)據(jù)庫(kù)中根本不存在表、行、列或關(guān)系。這意味著它們是與模式無(wú)關(guān)的;不需要在實(shí)際使用數(shù)據(jù)庫(kù)之前定義嚴(yán)格的模式。如果某個(gè)文檔需要添加一個(gè)新字段,它僅需包含該字段,從而不影響到數(shù)據(jù)庫(kù)中的其他文檔。因此,文檔不必為沒(méi)有值的字段儲(chǔ)存空數(shù)據(jù)值。
即將推出的書(shū)CouchDB: The Definitive Guide使用名片作為“現(xiàn)實(shí)的文檔”,并介紹了與關(guān)系數(shù)據(jù)庫(kù)相比,如何在面向文檔的數(shù)據(jù)庫(kù)中描述它。在關(guān)系數(shù)據(jù)庫(kù)中,您需要使用 4 個(gè)以上的表來(lái)儲(chǔ)存這些數(shù)據(jù):一個(gè)“Person”表、一個(gè)“Company”表、一個(gè)“Contact Details”表和一個(gè)用于儲(chǔ)存名片本身的表。這些表都有嚴(yán)格定義的列和鍵,并且使用一系列的連接(join)組裝數(shù)據(jù)。
雖然這樣做的優(yōu)勢(shì)是每段數(shù)據(jù)都有一個(gè)惟一真實(shí)的版本,但這為以后的修改帶來(lái)不便。此外,也不能修改其中的記錄以用于不同的環(huán)境。例如,一個(gè)人可能有傳真號(hào)碼,而另一個(gè)人沒(méi)有。在名片上不應(yīng)該顯示“傳真:沒(méi)有”,而是忽略任何關(guān)于傳真的細(xì)節(jié)。
在面向文檔的數(shù)據(jù)庫(kù)中,每個(gè)名片都儲(chǔ)存在各自的文檔中,并且每個(gè)文檔都可以定義它需要使用的字段。因此,對(duì)于沒(méi)有傳真號(hào)碼的人而言,就不需要定義傳真的值,而對(duì)于有傳真號(hào)碼的人,則根據(jù)他們的意愿定義該值。
這兩種數(shù)據(jù)庫(kù)的另一個(gè)不同點(diǎn)是惟一標(biāo)識(shí)符的儲(chǔ)存。在關(guān)系數(shù)據(jù)庫(kù)中通常可以使用主鍵,它由一個(gè)自動(dòng)遞增特性或序列生成器生成。當(dāng)然,這些標(biāo)識(shí)符僅相對(duì)于所使用的表或數(shù)據(jù)庫(kù)是惟一的 — 其他表或數(shù)據(jù)庫(kù)還可以使用它們。如果同時(shí)對(duì)不同網(wǎng)絡(luò)上的兩個(gè)數(shù)據(jù)庫(kù)執(zhí)行更新操作,這兩個(gè)數(shù)據(jù)庫(kù)不會(huì)同時(shí)準(zhǔn)確地獲取下一個(gè)惟一標(biāo)識(shí)符。CouchDB 沒(méi)有自動(dòng)遞增或序列特性。相反,它為每個(gè)文檔分配一個(gè)通用惟一標(biāo)識(shí)符(Universally Unique Identifier,UUID),這就杜絕了其他數(shù)據(jù)庫(kù)意外地選擇相同的惟一標(biāo)識(shí)符的情況。
面向文檔數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)的另一個(gè)重要區(qū)別就是面向文檔數(shù)據(jù)庫(kù)不支持連接。因此 CouchDB 中沒(méi)有主鍵和外鍵,沒(méi)有基于連接的鍵。這并不意味著不能從 CouchDB 數(shù)據(jù)庫(kù)獲取一組關(guān)系數(shù)據(jù)。一個(gè)稱(chēng)為視圖的特性允許您為沒(méi)有在數(shù)據(jù)庫(kù)中定義的文檔創(chuàng)建一種任意關(guān)系。這意味著您能夠獲得典型的 SQL 聯(lián)合查詢(xún)的所有好處,但又不需要在數(shù)據(jù)庫(kù)層預(yù)定義它們的關(guān)系。
一定要注意,雖然面向文檔數(shù)據(jù)庫(kù)的操作方式不同于關(guān)系數(shù)據(jù)庫(kù),但這并不意味著它們是可以替換的。CouchDB 的目的并不是替換關(guān)系數(shù)據(jù)庫(kù),而是為那些更適合使用面向文檔模型(而不是傳統(tǒng)的關(guān)系數(shù)據(jù)模型)的項(xiàng)目提供一種選擇,比如 wikis、博客和文檔管理系統(tǒng)。
參考資料 >
CouchDB使用體驗(yàn).TechTarget數(shù)據(jù)庫(kù).2015-09-24
CouchDB: The Definitive Guide.CouchDB.2013-04-17