不做 NoSQL 的 CouchDB(轉)

weixin_34162629發表於2012-04-12
CouchDB 作為 NoSQL 潮流中的一份子,很容易被拿來與被貼上一樣標籤 (buzzwords) 的資料庫作為比較。各個專桉分別被貼上 key-value stores、tuple stores、BigTable Clones、Document store、Graph database 等等標籤。

這些標籤分類有時很容易幫助程式設計者概略瞭解後段實做的技術屬性,但很多時候,程式設計者的預設看法也可能是錯誤且偏頗的。我們可以說這些新技術都是想解決 CAP theorem 問題,但其實這些不同的資料庫計劃各有其想要解決的問題與開發哲學,如果以概括性的功能特徵來作為選擇技術的方式,很多時候會發現專桉發展方向不一定適合自己需求。程式設計者應該先定義自己的問題後,再選擇屬性最適合的技術。

CouchOne 的開發者 Mikeal Rogers 曾說過,近期的產業浪潮掩蓋了各專桉實際要解決的問題,取而代之是對於 Big Data 的想像與期待。Mikeal 那麼就讓其他人(與舊資料庫業者)去追尋 NoSQL 的浪潮吧,CouchDB 可以專注於處理 Mobile Database。

CouchDB 特色

試用了 CouchDB 一陣子,幾個特別欣賞的特色功能,簡介如下:

* Implemention for ACID Properties
** Multi-Version Concurrency Control (MVCC)
** B-Tree indexes
* Schema-Free document-oriented database
* RESTful JSON API
* View model / JavaScript View Functions
* Replication (Peer-based distributed databases), Distributed, featuring robust, incremental replication with bi-directional conflict detection and management.

CouchDB 使用 MVCC model,所有的資料庫寫入 (add, update, delete) 都不需要先 lock 資料庫,因此能保證可以即時讀出資料。索引則是靠 B-Tree 大量存於硬碟,Document 會建立一份索引,利用 MapReduce pattern 設計的每一份 View,也會存取一份索引,因此你的資料庫會佔用大量硬碟空間來換取速度。

CouchApp 配合瀏覽器使用起來很方便且支援許可權功能,因為資料可以是隨意的 Json document,所以愛存什麼就存什麼。此外 API 介面是 RESTful,加上內建 Javascript 的 View Server,你可以用內建的 Show 功能來 Render Document。

最重要的特色是 Replication 功能。CouchDB 支援雙向衝突偵測,很方便長期離線的 Client 上線後快速同步資料庫內容,在離線狀態也可以存取已經拉回的資料。

CouchDB 目前限制

雖說 CouchDB 使用 MVCC Model,但 CouchDB 的讀寫速度遠遠慢於 in-memory key-value,與 MySQL 評測也未能夠勝出。加上 CouchDB 只支援 Replication,要作 Horizontal partitioning 要靠 CouchDB Lounge,等同於手動作 Sharding,在效能跟彈性上都未能夠勝過其他資料庫系統。

此外,作為存取 unstructured data 的代價,若想要查詢特別資料,必須依賴 View Model,每組 View 會建出獨立的 b-tree index,這種索引的代價頗高,特別是你想做 ad hoc query 時,使用 _temp_view 會浪費你大量的磁碟與 CPU 的運算資源。因此程式設計者在設計軟體與鍵入資料前,都必須先建好 View。

雖然 View functions 用了 MapReduce pattern,但礙於 CouchDB View API 的限制,目前很難做多次的資料處理。基本上一次 View 倒出來的資料僅限制一次查詢,你無法方便快速的做第二次 MapReduce 處理,如此缺乏彈性讓 MapReduce 反而像是一種限制,而非特色。

除了 Big Data 以外相關應用

捨去上述限制不談,CouchDB 的特色仍然可以作很多應用,特別是 JSON API 與 Peer-based distributed 這兩個功能。這使 CouchDB 在 Laptop 或 Mobile devices 上可以很方便地提供一些應用,特別是你經常需要在離線裝置上處理伺服器與本地端資料時。

除了像是 CouchOne 推出相容 CouchDB 的 CouchOne Mobile for Android。在 Linux 上則有 Desktop Couch,目前整合了 Tomboy、Evolution、Bindwood for Firefox 等,可以用來管理 PIM, Bookmarks 等等。理論上可以整合 UbuntuOne 或 Midgard。

筆者讀過兩本談論 CouchDB 的書籍,第一版的《CouchDB: The Definitive Guide》與《Beginning CouchDB》。個人比較推薦《Beginning CouchDB》,但再版的《CouchDB: The Definitive Guide》內容已經有改善。

◎ 作者簡介 蔡志展 (Rex Tsai) 或網名 chihchun,現為自由工作者,從事開源軟體顧問或開發服務。倡議並推廣自由軟體與開放原始碼,早期 KaLUG 成員,現常出席 Tossug, HackingThursday 聚會,亦是開源人年會 (COSCUP) 籌備志工。長期 Debian、OpenWrt 使用者。關注議題甚廣,進一步資訊請參考 http://people.debian.org.tw/~chihchun/

//---------------一下是我的讀後感

在國內,相比MongoDB ,CouchDB實在是很冷。冷的原因誠如上面文章所提,以空間換取時間的讀寫速度比不上MySQL,分散式架構要手動,API僅能一次查詢,未能二次篩選。這幾個方面都是致命的,對於資料來說。

有缺點,必有特點。特點就是採用JSON格式儲存, 以及更新就產生新版本,使得CouchDB作為離線資料庫用用還不錯。

相關文章