作為 NoSQL 潮流中的一份子,很容易被拿來與被貼上一樣標籤 (buzzwords) 的資料庫作為比較。各個專案分別被貼上 key-value stores, tuple stores, BigTable Clones, Document store, Graph database 等等標籤。
這些標籤分類有時很容易幫助使用者瞭解大概的後段實做技術屬性,但很多時候,也會把使用者帶來偏頗預設看法與錯誤理解。我們可以說這些新技術都是想解決 CAP theorem 問題,但其實這些不同的資料庫計劃各有其想要解決的問題與開發哲學,如果以概括性的功能特徵來作為選擇技術的方式,很多時候會發現專案發展方向適合自己需求。使用者應該先定義自己的問題後,再依照選擇最適合的專案屬性。
Mikeal Rogers (CouchOne 的開發者) 上個月就說,這波產業浪潮掩蓋了各專案實際要解決的問題,取而代之是對於 Big Data 的想像與期待。Mikeal 那麼就讓其他人 (與舊資料庫業者) 去追尋 NoSQL 的浪潮吧,CouchDB 可以專注與處理 Mobile Database。
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 一份索引,每一份 View (利用 MapReduce pattern 設計的查詢界面) 也會存有一份索引,因此你的資料庫會佔用有大量硬碟空間來換取速度。
另外則是資料可以是隨意的 Json document, 所以愛存什麼就存什麼。此外 API 界面是 RESTful,加上內建 Javascript 的 View Server,你可以用內建的 Show 功能 Render Document, CouchApp 很方便配合瀏覽器使用 (也支援權限功能)。
最重要的特色是 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 倒出來的資料僅限制一次查詢,你無法方便快速的做第二次 Map/Reduce 處理,如此缺乏彈形讓 MapReduce 反而像是限制,而非一種特色。
除了 Big Data 以外相關應用
捨去上述限制不談,CouchDB 的特色仍然可以作很多應用,特別是 JSON API 與 Peer-based distributed 這兩個功能,很方便在 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 1st Edition 與 Beginning CouchDB,比較推薦 Beginning CouchDB,但 CouchDB: The Definitive Guide 的下一版,內容已經有改善。
本文是個人使用經驗與看法,如果錯誤,歡迎指教。