2010-05-09 39 views
18

我對NoSQL的瞭解越多,對於我而言,它就越像是一個面向列的數據庫。NoSQL和Column-Oriented數據庫有什麼區別?

NoSQL(例如CouchDB,Cassandra,MongoDB)和列式數據庫(例如Vertica,MonetDB)之間的區別是什麼?

+3

區分兩種類型的列存儲:http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html – tuinstoel 2010-05-09 18:04:11

+0

結構化(列)與非結構化/半結構化(列) NoSQL的)。像這樣想想。 – 2014-01-14 18:40:08

回答

7

有些NoSQL數據庫是列式數據庫,有些SQL數據庫也是列式的。無論數據庫是列還是面向行是數據庫的物理存儲實現細節,對於關係數據庫和非關係數據庫(NoSQL)都是如此。

例如,Vertica是一個面向列的關係數據庫,因此它實際上不會被認定爲NoSQL數據存儲。

「NoSQL移動」數據存儲被定義爲非關係型,無共享,水平可伸縮的數據庫,沒有(必然)ACID保證。一些列式數據庫可以用這種方式表徵。除了列存儲之外,NoSQL實現還包括文檔存儲,對象存儲,元組存儲和圖形存儲。

0

由於@tuinstoel寫道,在article回答了3點你的問題:

3.接口。 A組的特點是作爲NoSQL移動的 的一部分,並且通常不具有傳統的SQL接口 。 B組支持標準SQL 接口。

5

NoSQL數據庫與傳統的基於模式的數據庫是不同的範例。它們旨在擴展和保存json數據等文檔。很顯然,他們有一種查詢信息的方式,但是你應該期待像eval(「person = * and age> 10)」這樣的語法來檢索數據,即使它們支持標準的SQL接口,它們也是用於其他的,所以如果你喜歡SQL你應該堅持傳統的數據庫

一個面向列的數據庫不同於傳統的面向行的數據庫,因爲它們存儲數據的方式,通過將整列而不是一行存儲在一起,可以在選擇在行數據庫中,如果你只選擇一行或一行中的一個或多個字段,則沒有區別

雖然你必須支付更昂貴的插入,但插入一個新行會導致許多磁盤操作取決於列數。

但是在SQL,ACID,外鍵等方面與傳統數據庫沒有區別。

3

我建議您閱讀NoSQL維基百科條目的taxonomy section,以瞭解NoSQL數據庫與傳統的面向模式數據庫的不同之處。面向列意味着行和列,這意味着一個(二維)模式,而NoSQL數據庫往往是無模式(鍵值存儲)或具有結構化內容但沒有正式模式(文檔存儲)。

對於文檔商店,每個「文檔」的結構和內容獨立於同一「集合」中的其他文檔。添加字段通常是代碼更改,而不是數據庫更改:新文檔會爲新字段獲取條目,而舊文檔會被視爲不存在字段的空值。同樣,「刪除」字段可能意味着您只需停止在代碼中引用它,而不必從每個文檔中刪除它(除非空間有限),然後您可以選擇只刪除那些最大的內容)。與此相比,必須更改整個表以添加或刪除傳統行/列數據庫中的列。

文檔還可以包含列表以及其他嵌套文檔。下面是MongoDB的樣本文檔(從博客或其它論壇後),表示爲JSON:

{ 
    _id : ObjectId("4e77bb3b8a3e000000004f7a"), 
    when : Date("2011-09-19T02:10:11.3Z"), 
    author : "alex", 
    title : "No Free Lunch", 
    text : "This is the text of the post. It could be very long.", 
    tags : [ "business", "ramblings" ], 
    votes : 5, 
    voters : [ "jane", "joe", "spencer", "phyllis", "li" ], 
    comments : [ 
    { who : "jane", when : Date("2011-09-19T04:00:10.112Z"), 
     comment : "I agree." }, 
    { who : "meghan", when : Date("2011-09-20T14:36:06.958Z"), 
     comment : "You must be joking. etc etc ..." } 
    ] 
} 

注「意見」是如何用自己的獨立結構嵌套文檔的列表。查詢可以從外部文檔「進入」這些文檔,例如查找由Jane發表評論的帖子,或者查找來自某個日期範圍的評論的帖子。

簡而言之,NoSQL數據庫典型的兩個主要差異是缺少超出傳統行/列數據庫二維方向的(正式)模式和內容。

0

下面是我的看法:面向列的數據庫正在處理數據在物理上存儲在磁盤上的方式。顧名思義,每一列都存儲在自己獨立的空間/文件中。這允許2件重要的事情:

  1. 由於您有單一的數據類型來處理,您可以獲得更好的壓縮比,達到10:1的數量級。
  2. 您可以獲得更好的數據讀取性能,因爲您可以避免整行掃描,並且只需選取SELECT查詢中指定的列即可。

另一方面,NoSQL是定義「邏輯」聚合級別以解釋數據的全新數據庫。有些人認爲數據具有層次關係(聚合是一個「節點」),而另一些則將數據視爲文檔(這是聚合級別)。他們不會規定物理存儲策略(有些可能會這樣做,但會從最終用戶身上抽象出來)。另外,整個NoSQL運動更多地與非結構化數據有關,或者更確切地說,數據集的模式不能預先定義,或者事先未知,因此不符合嚴格的關係模型。

面向列的數據庫仍在處理關係型數據,雖然消除了對指數等

5

的NoSQL是用於並非只有SQL,涵蓋四大類的名詞 - 鍵值,文檔,柱族和圖形數據庫

鍵值數據庫非常適合頻繁小型讀寫的應用程序以及簡單的數據模型。 這些記錄使用唯一標識記錄的密鑰進行存儲和檢索,並用於快速查找數據庫中的數據。

例如Redis,Riak等

文獻數據庫具有存儲不同屬性具有大量數據

例如沿着能力MongoDB中,CouchDB的等

列家庭數據庫是專爲大量數據,讀取和寫入性能和高可用性

如卡珊德拉,HBase的等

數據庫是一個數據庫,它使用圖結構進行語義查詢,使用節點,邊和屬性來表示和存儲數據

e.g的Neo4j,InfiniteGraph等

在瞭解NoSQL的,你必須要了解一些關鍵概念。

一致性 - 系統中的所有服務器將具有相同的數據,因此使用該系統的任何人都將獲得相同的副本,而不管哪個服務器應答他們的請求。

可用性 - 系統將始終對請求做出響應(即使它不是最新的數據或整個系統的一致性,或者只是表示系統不工作的消息)。

分區容差 - 即使單個服務器發生故障或無法聯繫,系統仍會繼續作爲一個整體運行。

大多數時候,NoSQL數據庫只能滿足三個屬性之上的兩個屬性。

從你的問題,

CouchDB的AP(可用性&分區)&文檔數據庫

卡桑德拉AP(可用性&分區)&列家族數據庫

MongoDB的CP(一致性&分區)&文檔數據庫

Vertica的CA(一致性&可用性)&列家族數據庫

MonetDBACID(原子性一致性隔離耐久度) &關係數據庫

來源:http://blog.nahurst.com/visual-guide-to-nosql-systems

enter image description here

看一看這個article1article2ppt了各種方案來選擇特定類型的數據庫。

相關問題