Berkeley DB數(shù)據(jù)庫(kù)是什么數(shù)據(jù)庫(kù)?

2010-08-28 10:54:37來(lái)源:西部e網(wǎng)作者:

  Berkeley DB (DB)是一個(gè)高性能的,嵌入數(shù)據(jù)庫(kù)編程庫(kù),和C語(yǔ)言,C++,Java,Perl,Python,PHP,Tcl以及其他很多語(yǔ)言都有綁定。Berkeley DB可以保存任意類(lèi)型的鍵/值對(duì),而且可以為一個(gè)鍵保存多個(gè)數(shù)據(jù)。Berkeley DB可以支持?jǐn)?shù)千的并發(fā)線程同時(shí)操作數(shù)據(jù)庫(kù),支持最大256TB的數(shù)據(jù),廣泛用于各種操作系統(tǒng)包括大多數(shù)Unix類(lèi)操作系統(tǒng)和Windows操作系統(tǒng)以及實(shí)時(shí)操作系統(tǒng)。

  2.0版本或以上的Berkeley DB由Sleepycat Software公司開(kāi)發(fā),并使用基于自由軟件許可協(xié)議/私有許可協(xié)議的雙重授權(quán)方式提供[1],附有源代碼。開(kāi)發(fā)者如果想把Berkeley DB嵌入在私有軟件內(nèi)需要得到Sleepycat公司的許可,若將軟件同樣遵循GPL發(fā)布,則不需許可即可使用。而2.0版本以下的則使用BSD授權(quán),可自由作商業(yè)用途。

  Berkeley DB最初開(kāi)發(fā)的目的是以新的HASH訪問(wèn)算法來(lái)代替舊的hsearch函數(shù)和大量的dbm實(shí)現(xiàn)(如AT&T的dbm,Berkeley的 ndbm,GNU項(xiàng)目的gdbm),Berkeley DB的第一個(gè)發(fā)行版在1991年出現(xiàn),當(dāng)時(shí)還包含了B+樹(shù)數(shù)據(jù)訪問(wèn)算法。在1992年,BSD UNIX第4.4發(fā)行版中包含了Berkeley DB1.85版;旧险J(rèn)為這是Berkeley DB的第一個(gè)正式版。在1996年中期,Sleepycat軟件公司成立,提供對(duì)Berkeley DB的商業(yè)支持。在這以后,Berkeley DB得到了廣泛的應(yīng)用,成為一款獨(dú)樹(shù)一幟的嵌入式數(shù)據(jù)庫(kù)系統(tǒng)。2006年Sleepycat公司被Oracle 公司收購(gòu),Berkeley DB成為Oracle數(shù)據(jù)庫(kù)家族的一員,Sleepycat原有開(kāi)發(fā)者繼續(xù)在Oracle開(kāi)發(fā)Berkeley DB,Oracle繼續(xù)原來(lái)的授權(quán)方式并且加大了對(duì)Berkeley DB的開(kāi)發(fā)力度,繼續(xù)提升了Berkeley DB在軟件行業(yè)的聲譽(yù)。Berkeley DB的當(dāng)前最新發(fā)行版本是4.7.25。

  值得注意的是DB是嵌入式數(shù)據(jù)庫(kù)系統(tǒng),而不是常見(jiàn)的關(guān)系/對(duì)象型數(shù)據(jù)庫(kù),對(duì)SQL語(yǔ)言不支持,也不提供數(shù)據(jù)庫(kù)常見(jiàn)的高級(jí)功能,如存儲(chǔ)過(guò)程,觸發(fā)器等。

  Berkeley DB的體系結(jié)構(gòu)

  Berkeley DB以擁有比Microsoft SQL Server和Oracle等數(shù)據(jù)庫(kù)系統(tǒng)而言更簡(jiǎn)單的體系結(jié)構(gòu)而著稱(chēng)。例如,它不支持網(wǎng)絡(luò)訪問(wèn)—程序通過(guò)進(jìn)程內(nèi)的API訪問(wèn)數(shù)據(jù)庫(kù)。他不支持SQL或者其他的數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言,不支持表結(jié)構(gòu)和數(shù)據(jù)列。 訪問(wèn)數(shù)據(jù)庫(kù)的程序自主決定數(shù)據(jù)如何儲(chǔ)存在記錄里,Berkeley DB不對(duì)記錄里的數(shù)據(jù)進(jìn)行任何包裝,每個(gè)記錄有且只有兩部分:鍵、值,所以在Berkeley DB的背景下通常用key/data pair指代一個(gè)記錄。記錄和它的鍵都可以達(dá)到4G字節(jié)的長(zhǎng)度。

  盡管架構(gòu)很簡(jiǎn)單,Berkeley DB卻支持很多高級(jí)的數(shù)據(jù)庫(kù)特性,比如ACID 數(shù)據(jù)庫(kù)事務(wù)處理,細(xì)粒度鎖,XA接口,熱備份以及同步復(fù)制。

  Berkeley DB包含有與某些經(jīng)典Unix數(shù)據(jù)庫(kù)編程庫(kù)兼容的接口,包括:dbm,ndbm和hsearch。

  Berkeley DB的核心數(shù)據(jù)結(jié)構(gòu)

  數(shù)據(jù)庫(kù)環(huán)境句柄DB_ENV: 每個(gè)DB_ENV相當(dāng)于一個(gè)數(shù)據(jù)庫(kù),它包含了數(shù)據(jù)庫(kù)全局信息,比如緩沖區(qū)大小、以及對(duì)事務(wù)、日志、鎖等子系統(tǒng)的全局配置信息。

  數(shù)據(jù)庫(kù)句柄結(jié)構(gòu)DB:每個(gè)DB相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)的一個(gè)表,其中存儲(chǔ)了很多 key/data pair。DB句柄代表了一個(gè)包含了若干描述數(shù)據(jù)庫(kù)表屬性的參數(shù),如數(shù)據(jù)庫(kù)訪問(wèn)方法類(lèi)型、邏輯頁(yè)面大小、數(shù)據(jù)庫(kù)名稱(chēng)等;同時(shí),DB結(jié)構(gòu)中包含了大量的數(shù)據(jù)庫(kù)處理函數(shù)指針,大多數(shù)形式為 (*dosomething)(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函數(shù)。

  數(shù)據(jù)庫(kù)記錄結(jié)構(gòu)DBT:DB中的記錄由關(guān)鍵字和數(shù)據(jù)構(gòu)成,關(guān)鍵字和數(shù)據(jù)都用結(jié)構(gòu)DBT表示。實(shí)際上完全可以把關(guān)鍵字看成特殊的數(shù)據(jù)。結(jié)構(gòu)中最重要的兩個(gè)字段是 void * data和u_int32_t size,分別對(duì)應(yīng)數(shù)據(jù)本身和數(shù)據(jù)的長(zhǎng)度。

  數(shù)據(jù)庫(kù)游標(biāo)結(jié)構(gòu)DBC:游標(biāo)(cursor)是數(shù)據(jù)庫(kù)應(yīng)用中常見(jiàn)概念,其本質(zhì)上就是一個(gè)關(guān)于特定記錄的遍歷器。注意到DB支持多重記錄(duplicate records),即多條記錄有相同關(guān)鍵字,在對(duì)多重記錄的處理中,使用游標(biāo)是最容易的方式。

  數(shù)據(jù)庫(kù)環(huán)境句柄結(jié)構(gòu)DB_ENV:環(huán)境在DB中屬于高級(jí)特性,本質(zhì)上看,環(huán)境是多個(gè)數(shù)據(jù)庫(kù)的包裝器。當(dāng)一個(gè)或多個(gè)數(shù)據(jù)庫(kù)在環(huán)境中打開(kāi)后,環(huán)境可以為這些數(shù)據(jù)庫(kù)提供多種子系統(tǒng)服務(wù),例如多線/進(jìn)程處理支持、事務(wù)處理支持、高性能支持、日志恢復(fù)支持等。

  DB中核心數(shù)據(jù)結(jié)構(gòu)在使用前都要初始化,隨后可以調(diào)用結(jié)構(gòu)中的函數(shù)(指針)完成各種操作,最后必須關(guān)閉數(shù)據(jù)結(jié)構(gòu)。從設(shè)計(jì)思想的層面上看,這種設(shè)計(jì)方法是利用面向過(guò)程語(yǔ)言實(shí)現(xiàn)面對(duì)對(duì)象編程的一個(gè)典范。

  Berkeley DB數(shù)據(jù)訪問(wèn)算法

  在數(shù)據(jù)庫(kù)領(lǐng)域中,數(shù)據(jù)訪問(wèn)算法對(duì)應(yīng)了數(shù)據(jù)在硬盤(pán)上的存儲(chǔ)格式和操作方法。在編寫(xiě)應(yīng)用程序時(shí),選擇合適的算法可能會(huì)在運(yùn)算速度上提高1個(gè)甚至多個(gè)數(shù)量級(jí)。大多數(shù)數(shù)據(jù)庫(kù)都選用B+樹(shù)算法,DB也不例外,同時(shí)還支持HASH算法、Recno算法和 Queue算法。接下來(lái),我們將討論這些算法的特點(diǎn)以及如何根據(jù)需要存儲(chǔ)數(shù)據(jù)的特點(diǎn)進(jìn)行選擇。

  B+樹(shù)算法

  B+樹(shù)是一個(gè)平衡樹(shù),關(guān)鍵字有序存儲(chǔ),并且其結(jié)構(gòu)能隨數(shù)據(jù)的插入和刪除進(jìn)行動(dòng)態(tài)調(diào)整。為了代碼的簡(jiǎn)單,DB沒(méi)有實(shí)現(xiàn)對(duì)關(guān)鍵字的前綴碼壓縮。B+樹(shù)支持對(duì)數(shù)據(jù)查詢(xún)、插入、刪除的常數(shù)級(jí)速度。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu).

  HASH算法

  DB中實(shí)際使用的是擴(kuò)展線性HASH算法(extended linear hashing),可以根據(jù)HASH表的增長(zhǎng)進(jìn)行適當(dāng)?shù)恼{(diào)整。關(guān)鍵字可以為任意的數(shù)據(jù)結(jié)構(gòu)。

  要求每一個(gè)記錄都有一個(gè)邏輯紀(jì)錄號(hào),邏輯紀(jì)錄號(hào)由算法本身生成。實(shí)際上,這和關(guān)系型數(shù)據(jù)庫(kù)中邏輯主鍵通常定義為int AUTO型是同一個(gè)概念。Recho建立在B+樹(shù)算法之上,提供了一個(gè)存儲(chǔ)有序數(shù)據(jù)的接口。記錄的長(zhǎng)度可以為定長(zhǎng)或不定長(zhǎng)。和Recno方式接近, 只不過(guò)記錄的長(zhǎng)度為定長(zhǎng)。數(shù)據(jù)以定長(zhǎng)記錄方式存儲(chǔ)在隊(duì)列中,插入操作把記錄插入到隊(duì)列的尾部,相比之下插入速度是最快的。

  對(duì)算法的選擇首先要看關(guān)鍵字的類(lèi)型,如果為復(fù)雜類(lèi)型,則只能選擇B+樹(shù)或HASH算法,如果關(guān)鍵字為邏輯記錄號(hào),則應(yīng)該選擇Recno或Queue算法。當(dāng)工作集關(guān)鍵字有序時(shí),B+樹(shù)算法比較合適;如果工作集比較大且基本上關(guān)鍵字為隨機(jī)分布時(shí),選擇HASH算法。Queue算法只能存儲(chǔ)定長(zhǎng)的記錄,在高的并發(fā)處理情況下,Queue算法效率較高;如果是其它情況,則選擇Recno算法,Recno 算法把數(shù)據(jù)存儲(chǔ)為平面文件格式。

  Berkeley DB的資源鏈接:

  官方主頁(yè):http://www.oracle.com/database/berkeley-db/db/index.html

  產(chǎn)品下載:http://www.oracle.com/technology/software/products/berkeley-db/index.html

  官方開(kāi)發(fā)者文檔中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html

  產(chǎn)品技術(shù)信息: http://www.oracle.com/technology/products/berkeley-db/pdf/berkeley-db-family-datasheet.pdf

  http://www.oracle.com/database/docs/berkeley-db-datasheet.pdf

  http://www.oracle.com/database/docs/Berkeley-DB-v-Relational.pdf

 

贊助商鏈接: