2011-09-27 31 views
60

我讀過的三種NoSQL數據庫是關鍵值,列導向和麪向文檔。面向列的NoSQL如何與面向文檔的不同?

鍵值非常簡單 - 一個明碼值。

我見過面向文檔的數據庫描述爲像鍵值一樣,但值可以是一個結構,就像一個JSON對象。每個「文檔」可以具有全部,部分或不具有與另一個相同的密鑰。

面向列似乎非常像面向文檔,因爲您不指定結構。

那麼這兩者之間有什麼區別,爲什麼你會使用一個呢?

我專門研究了MongoDB和Cassandra。我基本上需要一個可以改變的動態結構,但不會影響其他值。同時我需要能夠搜索/過濾特定的鍵並運行報告。對於CAP,AP對我來說是最重要的。只要不存在衝突或數據丟失,數據可以「最終」跨節點同步。每個用戶將獲得他們自己的「表」。

回答

26

在Cassandra中,每行(由一個鍵尋址)包含一個或多個「列」。列本身是鍵值對。列名不需要預定義,即結構不固定。一行中的列根據其鍵(名稱)按排序順序存儲。

在某些情況下,您可能在一行中包含非常大量的列(例如,充當用於啓用特定種類查詢的索引)。 Cassandra可以高效地處理這種大型結構,並且可以檢索特定範圍的列。

還有一個更高層次的結構(不太常用)稱爲超級列,其中列包含嵌套(子)列。

您可以將整體結構視爲嵌套散列表/字典,其中包含2或3級密鑰。

普通列族:

row 
    col col col ... 
    val val val ... 

超級列族:

row 
     supercol      supercol      ... 
      (sub)col (sub)col ...  (sub)col (sub)col ... 
      val  val  ...  val  val  ... 

也有更高層次的結構 - 列科和keyspaces - 可以用來瓜分或將您的數據分組在一起。

也看到這個問題:從http://wiki.apache.org/cassandra/ArticlesAndPresentations

重新Cassandra: What is a subcolumn

或數據建模鏈接:面向文檔的數據庫對比 - 後者通常插入整個文件(通常是JSON),而在卡桑德拉可以處理各個列或超級列,並單獨更新這些列,即它們以不同的粒度級別工作。每列都有其自己的單獨時間戳/版本(用於協調分佈式羣集中的更新)。

Cassandra列值只是字節,但可以鍵入爲ASCII,UTF8文本,數字,日期等

當然,您可以通過插入包含JSON的列將Cassandra用作原始文檔存儲 - 但您不會獲得真正的面向文檔的存儲的所有功能。

+0

那麼面向列的就像關係數據庫的表一樣,但翻轉過來,沒有模式要求?如果我要將Cassandra術語與MySQL術語進行比較,我該怎麼做?是一個像列家族還是密鑰空間的表?在面向文檔的情況下,你是否說你無法更新文檔中的單個關鍵字?看起來Casandra可以有子結構。 MongoDB和其他人喜歡它有這個功能嗎? – Luke

+3

列家族就像一張桌子。一行就像一個表格行。列有點像數據庫列,只不過它們可以實時定義,所以在某些情況下可能有一個非常稀疏的表,或者每行中可能有不同的列。 – DNA

+1

這取決於數據庫。在MongoDB中(面向文檔),你也可以更新每一個密鑰。 –

18

在「插入」中,要使用rdbms單詞,基於文檔的更加一致和直接。請注意,與cassandra相比,您可以與法定人數概念保持一致,但這不適用於所有基於列的系統,並且會降低可用性。在一次寫入/讀取往往很繁重的系統上,請去MongoDB。如果你總是打算讀取對象的整個結構,那麼也要考慮它。一個基於文檔的系統被設計爲當你得到它時返回整個文檔,並且在整行的返回部分不是很強。

像Cassandra這樣的基於列的系統比基於文件的「更新」更好。您甚至可以在不讀取包含該列的行的情況下更改列的值。寫入不需要在同一臺服務器上完成,一行可能包含在多臺服務器的多個文件中。在巨大的快速發展的數據系統上,請去Cassandra。如果您打算每個密鑰都有非常大的數據塊,並且不需要在每個查詢中加載所有數據,那麼也要考慮它。在「選擇」中,Cassandra讓你只加載你需要的列。

還認爲Mongo DB是用C++編寫的,並且在其第二個主要版本中,而Cassandra需要在JVM上運行,並且它的第一個主要版本僅在昨天發佈候選版本(但是0.X版本已經轉入大公司的生產)。另一方面,Cassandra的設計部分基於Amazon Dynamo,其核心是構建高可用性解決方案,但這與基於列的格式沒有任何關係。 MongoDB也可以擴展,但不像Cassandra那樣優雅。

33

主要區別在於文檔存儲(例如MongoDB和CouchDB)允許任意複雜的文檔,即子文檔內的子文檔,文檔列表等,而列存儲(例如Cassandra和HBase)僅允許固定格式,例如,嚴格的一級或兩級詞典。

相關問題