1. 程式人生 > 其它 >NoSQL資料庫型別簡介

NoSQL資料庫型別簡介

近些年來,NoSQL 資料庫的發展勢頭很快。據統計,目前已經產生了 50 到 150 個 NoSQL 資料庫系統。但是,歸結起來,可以將典型的 NoSQL 劃分為 4 種類型,分別是鍵值資料庫、列式資料庫、文件資料庫和圖形資料庫,如圖 1 所示。

圖 1 4 種類型的 NoSQL 資料庫

圖 2 鍵值資料庫舉例

1. 鍵值資料庫

鍵值資料庫起源於 Amazon 開發的 Dynamo 系統,可以把它理解為一個分散式的 Hashmap,支援 SET/GET 元操作。

它使用一個雜湊表,表中的 Key(鍵)用來定位 Value(值),即儲存和檢索具體的 Value。資料庫不能對 Value 進行索引和查詢,只能通過 Key 進行查詢。Value 可以用來儲存任意型別的資料,包括整型、字元型、陣列、物件等。

如圖 2 所示。鍵值儲存的值也可以是比較複雜的結構,如一個新的鍵值對封裝成的一個物件。一個完整的分散式鍵值資料庫會將 Key 按策略儘量均勻地雜湊在不同的結點上,其中,一致性雜湊函式是比較優雅的雜湊策略,它可以保證當某個結點掛掉時,只有該結點的資料需要重新雜湊。

在存在大量寫操作的情況下,鍵值資料庫可以比關係資料庫有明顯的效能優勢,這是因為關係型資料庫需要建立索引來加速查詢,當存在大量寫操作時,索引會發生頻繁更新,從而會產生高昂的索引維護代價。鍵值資料庫具有良好的伸縮性,理論上講可以實現資料量的無限擴容。

鍵值資料庫可以進一步劃分為記憶體鍵值資料庫和持久化鍵值資料庫。記憶體鍵值資料庫把資料儲存在記憶體中,如 Memcached 和 Redis。

持久化鍵值資料庫把資料儲存在磁碟中,如 BerkeleyDB、Voldmort 和 Riak。

鍵值資料庫也有自身的侷限性,主要是條件查詢。如果只對部分值進行查詢或更新,效率會比較低下。在使用鍵值資料庫時,應該儘量避免多表關聯查詢。此外,鍵值資料庫在發生故障時不支援回滾操作,所以無法支援事務。

大多數鍵值資料庫通常不會關心存入的 Value 到底是什麼,在它看來,那只是一堆位元組而已,所以開發者也無法通過 Value 的某些屬性來獲取整個 Value。

2. 列式資料庫

列式資料庫起源於 Google 的 BigTable,其資料模型可以看作是一個每行列數可變的資料表, 它可以細分為 4 種實現模式,如圖 3 所示。

圖 3 列式資料庫模型

其中,Super Column Family 模式可以理解為 maps of maps,例如,可以把一個作者和他的專輯結構化地存成 Super Column Family 模式,如圖 4 所示。

圖 4 Super Column Family 模式

在行式資料庫中查詢時,無論需要哪一列都需要將每一行掃描完。假設想要在QQ靚號購買地圖圖 5 中的生日列表中查詢 9 月的生日,資料庫將會從上到下和從左到右掃描表,最終返回生日為 9 月的列表。

圖 5 關係型資料庫資料模型

如果給某些特定列建索引,那麼可以顯著提高查詢速度,但是索引會帶來額外的開銷,而且資料庫仍在掃描所有列。

而列式資料庫可以分別儲存每個列,從而在列數較少的情況下更快速地進行掃描。圖 6 的佈局看起來和行式資料庫很相似,每一列都有一個索引,索引將行號對映到資料,列式資料庫將資料對映到行號,採用這種方式計數變得更快,很容易就可以查詢到某個專案的愛好人數, 並且每個表都只有一種資料型別,所以單獨善儲列也利於優化壓縮。

圖 6 列式 NoSQL 儲存模型

列式資料庫能夠在其他列不受影響的情況下,輕鬆新增一列,但是如果要新增一條記錄時就需要訪問所有表,所以行式資料庫要比列式資料庫更適合聯機事務處理過程(OLTP),因為 OLTP 要頻繁地進行記錄的新增或修改。

列式資料庫更適合執行分析操作,如進行彙總或計數。實際交易的事務,如銷售類,通常會選擇行式資料庫。列式資料庫採用高階查詢執行技術,以簡化的方法處理列塊(稱為“批處理”),從而減少了 CPU 使用率。

3. 文件資料庫

文件資料庫是通過鍵來定位一個文件的,所以是鍵值資料庫的一種衍生品。在文件資料庫中,文件是資料庫的最小單位。文件資料庫可以使用模式來指定某個文件結構。

文件資料庫是 NoSQL 資料庫型別中出現得最自然的型別,因為它們是按照日常文件的儲存來設計的,並且允許對這些資料進行復雜的查詢和計算。

儘管每一種文件資料庫的部署各有不同,但是大都假定文件以某種標準化格式進行封裝,並對資料進行加密。

文件格式包括 XML、YAML、JSON 和 BSON 等,也可以使用二進位制格式,如 PDF、Microsoft Office 文件等。一個文件可以包含複雜的資料結構,並且不需要採用特定的資料模式,每個文件可以具有完全不同的結構。

文件資料庫既可以根據鍵來構建索引,也可以基於文件內容來構建索引。基於文件內容的索引和查詢能力是文件資料庫不同於鍵值資料庫的主要方面,因為在鍵值資料庫中,值對資料庫是透明不可見的,不能基於值構建索引。

文件資料庫主要用於儲存和檢索文件資料,非常適合那些把輸入資料表示成文件的應用。從關係型資料庫儲存方式的角度來看,每一個事物都應該儲存一次,並且通過外來鍵進行連線,而檔案儲存不關心規範化,只要資料儲存在一個有意義的結構中就可以。

如圖 7 所示,如果我們要將報紙或雜誌中的文章儲存到關係型資料庫中,首先我們要對儲存的資訊進行分類,即將文章放在一個表中,作者和相關資訊放在一個表中,文章評論放在一個表中,讀者資訊放在一個表中,然後將這四個表連線起來進行查詢。

但是文件儲存可以將文章儲存為單個實體,這樣就降低了使用者對文章資料的認知負擔。

4. 圖形資料庫

圖形資料庫以圖論為基礎,用圖來表示一個物件集合,包括頂點及連線頂點的邊。圖形資料庫使用圖作為資料模型來儲存資料,可以高效地儲存不同頂點之間的關係。

圖形資料庫是 NoSQL 資料庫型別中最複雜的一個,旨在以高效的方式儲存實體之間的關係。

圖形資料庫適用於高度相互關聯的資料,可以高效地處理實體間的關係,尤其適合於社交網路、依賴分析、模式識別、推薦系統、路徑尋找、科學論文引用,以及資本資產叢集等場景。

圖 7 關係型資料庫和文件資料庫儲存報紙或雜誌中的文章的比較

圖形或網路資料主要由結點和邊兩部分組成。結點是實體本身,如果是在社交網路中,那麼代表的就是人。邊代表兩個實體之間的關係,用線來表示,並具有自己的屬性。另外,邊還可以有方向,如果箭頭指向誰,誰就是該關係的主導方,如圖 8 所示。

圖 8 圖形資料庫模型示意

圖形資料庫在處理實體間的關係時具有很好的效能,但是在其他應用領域,其效能不如其他 NoSQL 資料庫。

典型的圖形資料庫有 Neo4J、OrientDB、InfoGrid、Infinite Graph 和 GraphDB 等。有些圖形資料庫,如 Neo4J,完全相容 ACID 特性。