優(yōu)惠活動(dòng) - 12周年慶本月新客福利
                                      優(yōu)惠活動(dòng) - 12周年慶本月新客福利
                                      優(yōu)惠活動(dòng) - 12周年慶本月新客福利

                                      NOSQLI數據庫是什么?

                                      術(shù)語(yǔ)NOSQL包含了范固廣泛的數據庫,每一種數據庫都有自己的長(cháng)處和不足,而且大多都有非常不同的目標和用例。在觀(guān)察今天的 NOSOL共生系統時(shí),可以將數據庫劃分為5大類(lèi):純粹的鍵/值、數據結構、圖、面向文檔、高度分布。每種類(lèi)別的數據庫都面向不同的應用情況,而且每個(gè)類(lèi)別也都做了不同的折中。我們將分別考察這些數據庫,并看看其中的折中情況。

                                      純粹的鍵/值

                                      純粹的鍵值數據庫實(shí)際上已經(jīng)存在很長(cháng)時(shí)間了。甚至在SQL數據庫流行之前,dbm(一個(gè)純粹的鍵/值數據庫)就在世界上的很多UNX系統中使用了。之后是 Berkeley DB,目前仍然是一個(gè)維護中的富有生命活力的數據庫解決方案。今天,這些純粹的鍵值存儲庫正在重新流行起來(lái),部分原因是所有的 NOSQL數據庫都在變得流行起來(lái),但也是因為開(kāi)發(fā)了一些速度更快、更為現代的數據庫實(shí)現,如 Tokyo Cabinet、 Kyoto Cabinet、 Memcachedb。



                                      正是它們的簡(jiǎn)單性定義了這組數據庫。向數據庫存入一個(gè)鍵和一個(gè)值,然后用同一個(gè)鍵查詢(xún)數據庫,則會(huì )得到相同的值。沒(méi)有結構或類(lèi)型系統一一通常所處理的只是字節或字符串。因為這種簡(jiǎn)單性,這些數據庫的開(kāi)銷(xiāo)極小,所以非???。事實(shí)上,這些數據庫通常都是實(shí)現為磁盤(pán)上的B樹(shù)或哈希表。

                                      對一個(gè)純粹的鍵值數據庫進(jìn)行分片是直截了當的一一簡(jiǎn)單地選一個(gè)哈希算法,以鍵作為參數運行該算法,輸出就是要查詢(xún)或寫(xiě)入的數據庫節點(diǎn)。另一方面,對于復雜查詢(xún)就完全不是這么簡(jiǎn)單了。醫如對于這樣的查詢(xún):年齡大于50的用戶(hù),就無(wú)法直接查詢(xún),不得不維持另外一個(gè)鍵/值對,其中值是一個(gè)序列化的用戶(hù)鍵列表,這些用戶(hù)的年齡大于50,每次要創(chuàng )建新用戶(hù)或更新用戶(hù)信息,都要更新這個(gè)列表。

                                      對于純料的鍵/值存儲庫,可能的應用包括HTTP會(huì )話(huà)、用戶(hù)喜好以及URL縮寫(xiě)(shorteners)。我在前面已經(jīng)描述過(guò)HTTP會(huì )話(huà),HTTP會(huì )話(huà)應該以一種非常直接的方式存儲在能/值摩中。其中鍵就是用戶(hù)的會(huì )話(huà)關(guān)鍵字( session key),而值是包含用戶(hù)會(huì )話(huà)信息的一個(gè)序列化了的對象。對于用戶(hù)喜好,可以這樣來(lái)實(shí)現:鍵是用戶(hù)1D連接上用戶(hù)喜好的名稱(chēng),值就是用戶(hù)實(shí)際的喜好。對于URL縮寫(xiě),URL路徑就是鍵,而值就是路徑重定向的位置。

                                      數據結構

                                      數據結構數據庫對鍵/值數據庫做了些修改。在純粹鍵值數據庫中,通常只是將鍵和值作為字符串或字節來(lái)存儲,而數據結構數據庫則將其存儲為特定的數據結構,如列表、集合或哈希表。由于有了這些附加的結構,就可以對值執行一些原子操作。對于列表,可以對值進(jìn)行壓入或彈出操作。對于集合,可以執行并集和交集操作??梢詫祿靾绦性趹贸绦蛑袑祿Y構進(jìn)行的各種操作。本質(zhì)上,這些都是應用程序已經(jīng)在使用的數據結構只不過(guò)由外部進(jìn)程維護而已。

                                      實(shí)際上這個(gè)領(lǐng)域唯一的競爭者就是Redis。某些實(shí)現細節使得Redis很有。Redis默認是在內存中存儲其全部?jì)热莸?,只是周期性地將內容的快照存儲到磁盤(pán)。這使得Redist出奇得快,但假如數據庫崩潰了,就會(huì )對數據造成一些損失。同時(shí)也意味著(zhù)必須有足夠的內存(RAM)存儲整個(gè)數據庫。值得指出的是,這些默認設置是可以改變的一可以以速度為代價(jià)來(lái)增加數據的可持續性,還可以使用虛擬內存模式,這樣就可以存儲比實(shí)際內存更多的數據(雖然仍然是有限制的)。

                                      數器、任務(wù)隊列或趨勢分析,是很理想的。想象一下,給每個(gè)登錄進(jìn)來(lái)的用戶(hù)一個(gè)唯一的鍵,映射到一張空表上,該用戶(hù)訪(fǎng)問(wèn)的每個(gè)頁(yè)面的每個(gè)URL都從尾部壓人這張表。然后就可以獲取任何用戶(hù)的這些信息,觀(guān)察該用戶(hù)的訪(fǎng)問(wèn)路徑,并對該路徑進(jìn)行分析。通過(guò)這張表的長(cháng)度就可以得出該用戶(hù)的活躍程度。這是一個(gè)人為的例子,但仍然展示了極快的內存操作和豐富的數據結構能做什么事情。



                                      圖數據庫幾乎就是數據結構數據庫的一個(gè)特定實(shí)現,因為圖本就是一種數據結構。區別是圖數據庫不再是基于鍵/值,數據是作為圖的節點(diǎn)和邊存儲的。圖數據庫不是用鍵來(lái)查詢(xún)值,而是給出根節點(diǎn)的句柄,然后就可以遍歷整個(gè)圖以找到需要的節點(diǎn)或者邊。這會(huì )非常有價(jià)值,因為很多應用程序都大量使用了圖這種數據結構,將這些數據結構映射為圖數據庫上的操作是相當容易的。就像數據結構數據庫一樣,數據庫的圖也跟應用程序使用的圖是一樣的,只不過(guò)是由外部進(jìn)程維護的而已。

                                      這個(gè)領(lǐng)域的主要競爭者是Neo4j,這是是一個(gè)嵌入式的ava圖數據庫,但可以用好幾種語(yǔ)言進(jìn)行訪(fǎng)同。除了Neo4之外,其他開(kāi)源的圖數據庫包括Hypergraphdb、Infogrid、Vertexdb Hypergraphdb定位在對圖的一種更為通用的表示上,其中之一就是邊可以指向多個(gè)節點(diǎn)。Vertex的有趣之處是呈現了一個(gè)RESTFULL的HTTPAPI,通過(guò)這個(gè)API可以直接訪(fǎng)問(wèn)數據庫,而其他幾種數據庫主要都是通過(guò)Java方法來(lái)訪(fǎng)問(wèn)的。

                                      圖數據庫的優(yōu)勢應該正是你所期望的:存儲圖或樹(shù)形的數據。例如,假如網(wǎng)站想要維護一個(gè)社交圖(social graph),則使用圖數據庫會(huì )產(chǎn)生一些有趣的應用。警如,發(fā)現或向用戶(hù)推薦新朋友,傳統上實(shí)現起來(lái)既復雜,速度又慢,而使用圖數據庫則既簡(jiǎn)單,效率又高一一僅僅運行一下寬度優(yōu)先搜索或最短路徑遍歷,事情就搞定了。

                                      面向文檔

                                      面向文檔的數據庫又類(lèi)似于鍵值數據庫,但值不再是字節、字符串、列表、集合,而是文檔”。什么是文檔?在我們要談到的兩個(gè)面向文檔數據庫 COUCHDB和MONGODB中,文檔是作為JSON(或類(lèi)似于JSON)對象存儲的,本質(zhì)上是一種哈希表或字典。這些值都有相同的結構,意味著(zhù)可以用查詢(xún)來(lái)探測這種結構,并只返回所需要的文檔。要記住的是,這種查詢(xún)能力是建立在通過(guò)鍵來(lái)查找文檔的能力之上的。

                                      COUCHDB是一個(gè)面向文檔的數據庫,是用 Erlang開(kāi)發(fā)的,有一些有趣的實(shí)現細節,警如說(shuō)是一種只附加(append-only)的數據結構,并且能夠在數據庫中直接向應用程序提供服務(wù)。Mongodb是另一個(gè)面向文檔的數據庫,是用C++開(kāi)發(fā)的,在速度上做了很多優(yōu)化,提供了一個(gè)更加傳統的查詢(xún)層。雖然這兩個(gè)系統在紙上看起來(lái)很像,但目標卻是不同的。在我寫(xiě)這些東西的時(shí)候,COUCHDB的趨勢是作為桌面數據庫或瀏覽器中的數據庫,由用戶(hù)下載安裝,而Mongodb則趨向于更多地用在數據中心。

                                      在不能確切地知道能獲得什么數據時(shí),如在生活串流應用中那樣,面向文檔的數據庫就非常合適了。在這樣的應用中,從一個(gè)流行的照片網(wǎng)站上檢索的文檔應該包含照片屬性,而來(lái)自微博網(wǎng)站的文檔可能有一些地理屬性,而來(lái)自博客網(wǎng)站的文檔將不會(huì )有這些信息。面向文檔數據庫的另一個(gè)不錯的應用是內容管理系統,在這樣的系統中,每個(gè)文檔都表示一個(gè)頁(yè)面,或頁(yè)面的一部分。
                                       
                                      高度分布

                                      高度分布的數據庫多少有些不同一一有些本質(zhì)上更接近于鍵/值存儲,其他則更像大型的多維哈希圖。它們的共同點(diǎn)是都為多節點(diǎn)部署優(yōu)化過(guò)。在這些系統中,簡(jiǎn)單地在集群中增加一個(gè)新節點(diǎn)就會(huì )增加更多的容量。其中一個(gè)節點(diǎn)失效并不會(huì )導致數據損失,但會(huì )失掉一些容量。多數這種系統都會(huì )允許用戶(hù)犧牲掉一些一致性而保證高可用性和分區容錯性。

                                      Hbase是一個(gè)高度分布式的數據庫,源自于Hadoop-項目,并且受到Big Table(Google專(zhuān)有的高度分布式數據庫)的直接影響。 Cassandra是另一個(gè)高度分布式數據庫,最初是在Facebook開(kāi)發(fā)的,雖然數據模型非常類(lèi)似于Hbase,但集中在不產(chǎn)生單點(diǎn)故障以及寫(xiě)操作性能上。Hbase和Cassandra都將數據存儲為大型的多維哈希圖。 Basho公司的Riak是另個(gè)高度分布式數據庫,使用Erlang開(kāi)發(fā),可以通過(guò)RESTFULL的HTTPAPE來(lái)訪(fǎng)問(wèn),和Hibase與Cassandra比起來(lái),是一個(gè)更加簡(jiǎn)單的鍵值模型。Voldemort和Hypertable項目是另外兩個(gè)值得提及的高度分布式數據庫。

                                      為什么要使用高度分布的網(wǎng)站建設數據庫呢?噢,通常都是沒(méi)有其他選擇的結果。這些數據庫都是用在這樣的場(chǎng)合,就是其他的數據庫(基于SQL的數據庫或其他數據庫)或者對數據無(wú)法處理,或者無(wú)法處理那些查詢(xún)。幾乎每個(gè)問(wèn)題領(lǐng)域(problem domain)都可以用這些數據庫系統來(lái)建模,但有時(shí)候會(huì )比許多傳統數據庫更為詭異。

                                      本文地址:http://www.havencoinwallet.com//article/3357.html
                                      相關(guān)文章:
                                      最新文章:
                                      国产免费丝袜调教视频爱剪辑|国产小受18asian|国产福利91精品一区二区三区|久久久青草大香|欧美丰满熟妇xxxx性