CouchDB

**Apache CouchDB** 是一個開源資料庫，專注於易用性和成為 "完全擁抱 web 的資料庫"。它是一個使用 JSON 作為儲存格式，JavaScript 作為查詢語言，MapReduce 和 HTTP 作為 API 的文件導向的 NoSQL 資料庫。其中一個顯著的功能就是多主複製。CouchDB 的第一個版本釋出在 2005 年，在 2008 年成為了 Apache 的專案。

不同於關係型資料庫，CouchDB 沒有將資料和關係儲存在表格里。替代的，每個資料庫是一個獨立的文件集合。每一個文件維護其自己獨立的資料和自包涵的 schema。一個應用程式可能會存取多個資料庫，比如其中一個位於使用者的手機上，另一個位於在遠端的伺服器上。文件的元資料包含版本資訊，讓其能夠合併可能因為資料庫連結遺失導致的任何差異。

CouchDB 實現了一個多版本並行控制（MVCC）形式，用來避免在資料庫寫操作的時候對檔案進行加鎖。衝突留給應用程式去解決。解決一個衝突的通用操作的是首先合併資料到其中一個文件，然後刪除舊的資料。

其他功能包括文件級別的 ACID 語意和最終一致性，MapReduce，複製（Replication）。它還支援通過一個做 Futon 的內建 web 應用程式來進行資料庫管理。

## 歷史

CouchDB（Couch 是 _cluster of unreliable commodity hardware_ 的首字母縮寫）是前 IBM 的 Lotus Notes 開發者 Damien Katz 建立於 2005 年的一個專案。Damien Katz 將其定義為「面向大規模可延伸物件資料庫的儲存系統」。他對該資料庫的目標是讓其成為網際網路的資料庫，其從底層的設計就支援部署 web 應用程式。他自己通過將近兩年的時間建立了該專案同時將其作為開源專案在 GNU General Public License 下釋出。

在 2008 年 2 月，其成為 Apache Incubator 專案，同時其授權條款變更為 Apache License。幾個月後，其升級為頂級專案。這促使了其第一個穩定版在 2010 年 7 月釋出。

在 2012 年初期，Damien Katz 離開了專案專注於 Couchbase Server。不過該專案還在繼續進行中，在 2012 年 4 月釋出了 1.2 版本，2013 年 4 月釋出了 1.3 版本。

## 主要功能

**文件儲存**
: CouchDB 將資料儲存為「文件」，其為用 JSON 表示的有一個或者多個欄位 / 值的對。欄位的值可以是簡單的東西比如字串，數字，或者時間；但是陣列和字典同樣也可以使用。CouchDB 中的每一個文件有一個唯一的 id 但是沒有必須的文件 schema。

**ACID 語意**
: CouchDB 提供了 ACID 語意，其通過多版本並行控制的形式來實現，意味著 CouchDB 能夠處理大量的並行讀寫而不會產生衝突。

**Map/Reduce 視圖 和 索引**
: 儲存的資料通過視圖進行組裝。在 CouchDB 中，每一個視圖都是由作為 map/reduce 操作中的 Map 部分的 JavaScript 函式構成。該函式接受一個文件並且將其轉換為一個單獨的值來返回。CouchDB 能夠對視圖進行索引，同時在文件新增，修改，刪除的時候對這些索引進行更新。

**支援複製的分散式架構**
: CouchDB 的設計基於支援雙向的複製（同步）和離線操作。這意味著多個複製能夠對同一資料有其自己的拷貝，可以進行修改，之後將這些變更進行同步。

**REST API**
: 所有的資料都有一個唯一的通過 HTTP 暴露出來的 URI。REST 使用 HTTP 方法 POST，GET，PUT 和 DELETE 來操作對應的四個基本 CRUD (Create，Read，Update，Delete）操作來操作所有的資源。

**最終一致性**
: CouchDB 保證最終一致性，使其能夠同時提供可用性和分割容忍。

**離線支援**
: CoucbDB 能夠同步複製到可能會離線的終端裝置（比如智慧型手機），同時當設定再次線上時處理資料同步。

CouchDB 內建了一個的叫做 Futon 的通過 web 存取的管理介面。

## 使用案例、產品部署

CouchDB 的複製和同步強大功能讓其能夠使用在無法保證網路連結但是應用程式必須繼續在離線模式工作的行動裝置。

### 使用 CouchDB 的企業

一些使用 CouchDB 的企業範例：

* Ubuntu，在 2009 年開始使用其作為同步服務「Ubuntu One」 但是在 2011 年停止使用。
* BBC，用在其動態內容平台。
* Credit Suisse，用在其內部的商品部門的市場框架。
* Meebo，用在其社交平台（web 和應用程式），Meebo 在 2012 年 7 月 12 日被 Google 收購同時被關閉。

## 資料操作

CoucbDB 管理 JSON 文件的集合。文件通過視圖進行組織。視圖通過 Aggregate 函式進行定義，過濾查詢的時候平行計算，類似 MapReduce。

### 通過 HTTP 存取資料

應用程式通過 HTTP 與 CouchDB 進行互動。下面是一些通過 cURL 進行演示的範例。這些範例假設 CouchDB 執行在本地 localhost（127.0.0.1）的 5984 埠。

## 開源組件

CouchDB 包含了一些其他的開源專案作為其自己的內建包。

## 其他

* BigCouch
* Cassandra (database)
* Couchbase Server
* Document-oriented database
* Lotus Notes
* MongoDB
* Redis
* Mnesia
* OrientDB
* Riak
* XML database

## 參考文獻

## 外部連結

* 官方網站
* CouchDB: The Definitive Guide
* CouchDB articles on NoSQLDatabases.com
* CouchDB news and articles on myNoSQL（頁面存檔備份，存於網際網路檔案館）
* Scaling CouchDB（頁面存檔備份，存於網際網路檔案館）
* Complete HTTP API Reference
* Simple PHP5 library to communicate with CouchDB（頁面存檔備份，存於網際網路檔案館）
* Asynchronous CouchDB client for Java（頁面存檔備份，存於網際網路檔案館）
* Asynchronous CouchDB client for Scala（頁面存檔備份，存於網際網路檔案館）
* 3 CouchDB Case Studies（頁面存檔備份，存於網際網路檔案館）
* CouchDB for access log aggregation and analysis
* Lehnardt, Jan. Couch DB at 10,000 feet. Erlang eXchange 2008. 2008 [15 April 2012]. （原始內容存檔於 2012-11-09）.
* Lenhardt, Jan. CouchDB for Erlang Developers. Erlang Factory London 2009. 2009 [15 April 2012]. （原始內容存檔於 2011-06-19）.
* Katz, Damien. CouchDB and Me. RubyFringe. InfoQ. January 2009 [15 April 2012]. （原始內容存檔於 2011-04-27）.