我對NoSQL的瞭解越多,對於我而言,它就越像是一個面向列的數據庫。NoSQL和Column-Oriented數據庫有什麼區別?
NoSQL(例如CouchDB,Cassandra,MongoDB)和列式數據庫(例如Vertica,MonetDB)之間的區別是什麼?
我對NoSQL的瞭解越多,對於我而言,它就越像是一個面向列的數據庫。NoSQL和Column-Oriented數據庫有什麼區別?
NoSQL(例如CouchDB,Cassandra,MongoDB)和列式數據庫(例如Vertica,MonetDB)之間的區別是什麼?
有些NoSQL數據庫是列式數據庫,有些SQL數據庫也是列式的。無論數據庫是列還是面向行是數據庫的物理存儲實現細節,對於關係數據庫和非關係數據庫(NoSQL)都是如此。
例如,Vertica是一個面向列的關係數據庫,因此它實際上不會被認定爲NoSQL數據存儲。
「NoSQL移動」數據存儲被定義爲非關係型,無共享,水平可伸縮的數據庫,沒有(必然)ACID保證。一些列式數據庫可以用這種方式表徵。除了列存儲之外,NoSQL實現還包括文檔存儲,對象存儲,元組存儲和圖形存儲。
由於@tuinstoel寫道,在article回答了3點你的問題:
3.接口。 A組的特點是作爲NoSQL移動的 的一部分,並且通常不具有傳統的SQL接口 。 B組支持標準SQL 接口。
NoSQL數據庫與傳統的基於模式的數據庫是不同的範例。它們旨在擴展和保存json數據等文檔。很顯然,他們有一種查詢信息的方式,但是你應該期待像eval(「person = * and age> 10)」這樣的語法來檢索數據,即使它們支持標準的SQL接口,它們也是用於其他的,所以如果你喜歡SQL你應該堅持傳統的數據庫
一個面向列的數據庫不同於傳統的面向行的數據庫,因爲它們存儲數據的方式,通過將整列而不是一行存儲在一起,可以在選擇在行數據庫中,如果你只選擇一行或一行中的一個或多個字段,則沒有區別
雖然你必須支付更昂貴的插入,但插入一個新行會導致許多磁盤操作取決於列數。
但是在SQL,ACID,外鍵等方面與傳統數據庫沒有區別。
我建議您閱讀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數據庫典型的兩個主要差異是缺少超出傳統行/列數據庫二維方向的(正式)模式和內容。
下面是我的看法:面向列的數據庫正在處理數據在物理上存儲在磁盤上的方式。顧名思義,每一列都存儲在自己獨立的空間/文件中。這允許2件重要的事情:
另一方面,NoSQL是定義「邏輯」聚合級別以解釋數據的全新數據庫。有些人認爲數據具有層次關係(聚合是一個「節點」),而另一些則將數據視爲文檔(這是聚合級別)。他們不會規定物理存儲策略(有些可能會這樣做,但會從最終用戶身上抽象出來)。另外,整個NoSQL運動更多地與非結構化數據有關,或者更確切地說,數據集的模式不能預先定義,或者事先未知,因此不符合嚴格的關係模型。
面向列的數據庫仍在處理關係型數據,雖然消除了對指數等
Distinguishing between coloumn stores閱讀這篇博客的需要。這回答你的問題。
的NoSQL是用於並非只有SQL,涵蓋四大類的名詞 - 鍵值,文檔,柱族和圖形數據庫。
鍵值數據庫非常適合頻繁小型讀寫的應用程序以及簡單的數據模型。 這些記錄使用唯一標識記錄的密鑰進行存儲和檢索,並用於快速查找數據庫中的數據。
例如Redis,Riak等
文獻數據庫具有存儲不同屬性具有大量數據
例如沿着能力MongoDB中,CouchDB的等
列家庭數據庫是專爲大量數據,讀取和寫入性能和高可用性
如卡珊德拉,HBase的等
圖數據庫是一個數據庫,它使用圖結構進行語義查詢,使用節點,邊和屬性來表示和存儲數據
e.g的Neo4j,InfiniteGraph等
在瞭解NoSQL的,你必須要了解一些關鍵概念。
一致性 - 系統中的所有服務器將具有相同的數據,因此使用該系統的任何人都將獲得相同的副本,而不管哪個服務器應答他們的請求。
可用性 - 系統將始終對請求做出響應(即使它不是最新的數據或整個系統的一致性,或者只是表示系統不工作的消息)。
分區容差 - 即使單個服務器發生故障或無法聯繫,系統仍會繼續作爲一個整體運行。
大多數時候,NoSQL數據庫只能滿足三個屬性之上的兩個屬性。
從你的問題,
CouchDB的:AP(可用性&分區)&文檔數據庫
卡桑德拉:AP(可用性&分區)&列家族數據庫
MongoDB的:CP(一致性&分區)&文檔數據庫
Vertica的:CA(一致性&可用性)&列家族數據庫
MonetDB:ACID(原子性一致性隔離耐久度) &關係數據庫
區分兩種類型的列存儲:http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html – tuinstoel 2010-05-09 18:04:11
結構化(列)與非結構化/半結構化(列) NoSQL的)。像這樣想想。 – 2014-01-14 18:40:08