MongoDB與CouchDB 全方位對比
http://blog.nosqlfan.com/html/1519.html
本文見於MongoDB官方網站,MongoDB與CouchDB 很相似,他們都是文檔型存儲,數據存儲格式都是JSON型的,都使用JavaScript進行操作,都支持Map/Reduce。但是其實二者有著很多本質的區別,本文透過現象追尋本質,讓你更好的理解mongodb 與CouchDB。nosqlfan 翻譯如下:
原文鏈接:Comparing Mongo DB and Couch DB
1.MVCC(Multiversion concurrency control)
MongoDB 與 CouchDB 的一大區別就是CouchDB 是一個MVCC的系統,而MongoDB是一個update-in-place 的系統。這二者的區別就是,MongoDB 進行寫操作時都是即時完成寫操作,寫操作成功則數據就寫成功了,而CouchDB 一個支持多版本控制的系統,此類系統通常支持多個結點寫,而系統會檢測到多個系統的寫操作之間的沖突並以一定的算法規則予以解決。
2.水平擴展性
在擴展性方面,CouchDB 使用replication 去做,而MongoDB 的replication 僅僅用來增強數據的可靠性,MongoDB 在實現水平擴展性方面使用的是Sharding。(據說CouchDB 也有開發分片功能的計劃)
3.數據查詢操作
這個區別在用戶接口上了,MongoDB 與傳統的數據庫系統類似,支持動態查詢,即使在沒有建立索引的行上,也能進行任意的查詢。而 CouchDB 不同,CouchDB 不支持動態查詢,你必須為你的每一個查詢模式建立相應的view,並在此view的基礎上進行查詢。
4.原子性
這一點上兩者比較一致,都支持針對行的原子性修改(concurrent modifications of single documents),但不支持更多的復雜事務操作。
5.數據可靠性
CouchDB 是一個”crash-only” 的系統,你可以在任何時候停掉CouchDB 並能保證數據的一致性。而MongoDB 在不正常的停掉後需要運行 repairDatabase() 命令來修復數據文件,在1.7.5 版本後支持單機可靠的 –dur命令。
6.Map/Reduce
MongoDB 和 CouchDB 都支持Map/Reduce ,不同的是MongoDB 只有在數據統計操作中會用到,而CouchDB 在變通查詢時也是使用 Map/Reduce。
7.使用 javascript
MongoDB 和CouchDB 都支持javascript,CouchDb 用javascript來創建view。MongoDB 使用JSON作為普通數據庫操作的表達式。當然你也可以在操作中包含javascript語句。MongoDB還支持服務端的javascript腳本(running arbitrary javascript functions server-side),當然,MongoDB 的Map/Reduce 函數也是javascript 格式的。
8.REST
CouchDB 是一個RESTFul 的數據庫,其操作完全走HTTP協議,而MongoDB是走的自己的二進制協議。MongoDB Server在啟動時可以開放一個HTTP 的接口供狀態監控。
9.性能
- 此處主要列舉了MongoDB 自己具有高性能的原因
- 采用二進制協議,而非CouchDB REST的HTTP 協議
- 使用Momary Map 內存映射的做法
- collection-oriented,面向集合的存儲,同一個collection的數據是連續存儲的
- update-in-place 直接修改,而非使用MVCC的機制
- 使用C++ 編寫
10.適用場景
- 如果你在構建一個 Lotus Notes 型的應用,我們推薦使用CouchDB,主要是由於它的MVCC機制。另外如果我們需要master-master 的架構,需要基於地理位置的數據分布,或者在數據結點可能不在線的情況下,我們推薦使用CouchDB。
- 如果你需要高性能的存儲服務,那我們推薦 MongoDB,比如用於存儲大型網站的用戶個人信息,比如用於構建在其它存儲層之上的Cache層。
- 如果你的需求中有大量 update 操作,那麽使用MongoDB吧。就像我們在例子updating real time analytics counters 中的一樣,對於那種經常變化的數據,比如瀏覽量,訪問數之類的數據存儲。
MongoDB與CouchDB 全方位對比