2010-04-28 75 views
8

根據Wikipedia NoSQL article,有很多NoSQL實現。要選哪個NoSQL存儲

面向文檔和鍵值存儲(正如人們最常提到的)有什麼區別?

+0

它主要取決於您的需求。 – Htbaa 2010-04-28 13:50:41

+0

這是關於NoSQL的問題,根本不涉及某人的需求。 – 2010-04-28 19:57:14

+0

好吧,根據你的情況,最好的選擇會改變,因爲它們沒有全部相同的功能。您是否需要高度可擴展的解決方案?或者它只是一個小商店?你需要執行搜索嗎?或只是通過密鑰獲取?它大部分是讀取?寫?都?性能各不相同。因此,這個問題要求你確定你的要求 – 2010-04-28 20:05:01

回答

13

這是我寫的一篇博文,Visual Guide to NoSQL Systems,說明了一些最流行的系統之間的主要區別。他們之間最大的區別是他們選擇以下兩種方式中的哪一種進行優化:一致性,可用性和分區容差。

+1

你可以選擇兩個的想法是誤導性的:http://dbmsmusings.blogspot.com/2010/04/problems-with-cap-and-yahoos-little.html – TTT 2010-05-03 20:36:42

2

在一個層次上,文檔和鍵/值非常相似 - 當你請求一個鍵時,兩者都會返回一個對象。在純鍵/值中,對象將是一個簡單的字符串,儘管它可以是一個序列化的複雜對象。文檔數據庫通過函數對這個對象進行擴展,例如部分更新功能或搜索索引。

除此之外,您需要考慮您的特定需求--NOSQL涵蓋了很多不同的系統,與SQL數據庫不同,它們在特定情況下具有完全不同的優點/缺點。

2

在我看來,我真的不知道Cassandra是如何不一致的。它不能進行一致的更新,但我從來沒有與需要更新的數據庫模型一起工作,而不是一致的版本化插入(有時稱爲版本化更新,即使它們不是真正的更新)。 ACID如果你使用你的數據模型ACID,而不是使用數據庫事務,那麼以銀行的方式進行交易,交易不是多重數據變化,而是實際的數據對象。在他們中,他們有交易,而你的賬戶當前狀態是從交易中計算出來的,這些交易不是數據庫特徵,而是數據模型的一部分,爲了保持一致性,他們不需要立即可用於所有節點,因爲他們是我mmutable。

我還沒有找到使數據不可變的情況不能解決一致性問題的情況。這與將數據模型的事務作爲不可變數據的一部分(一次寫入多次讀取)相結合,滿足了ACID要求。

原子 - 作爲唯一不可變對象/行的事務成爲原子,沒有任何複雜的數據庫對象來支持它。

一致性 - 可以在數據模型中設計數據庫操作或事務,使其一致。所有需要的是它是不可變的(創建後永遠不會改變)

隔離 - 一個事務是自己的數據對象,不應該干擾他人,因此是孤立的。

持久性 - 如果事務不可變數據丟失,它相當於將數據庫恢復到其以前的狀態。如果數據沒有丟失,那麼它處於事務後狀態。在任何一種情況下,它都會滿足ACID的耐久性要求。

確實,在「銀行」數據模型中無法實現幾件事情。您的賬戶信息不能擁有固定金額的ACID行。雖然交易本身就是ACID,但並不意味着數據依賴於它們。這是因爲所有的事務可能還沒有從所有節點可見。他們甚至可能在另一家銀行的數據庫中。因此,您的帳戶餘額無法達到ACID一致性,但只要所有重要數據具有ACID一致性,就沒有理由具備這種要求。

我以銀行數據庫爲例,因爲它經常用作關於如何在賬戶餘額上回滾SQL事務的例子 - 在實際實現中永遠不會發生的事情......因爲銀行事務必須支持異步多線程,數據庫交易,或換句話說跨銀行交易。

您也可以將其與文件系統相關聯。 Cassandra(例如)可以爲您提供文件不可變快照的一致視圖。你不能保證看到最新的快照 - 但是一個快照。這使得它與CVS/SVN或CODA一致。