From Wikipedia, the free encyclopedia
CouchDB's Futon Administration Interface, User database
|Original author(s)||Damien Katz, Jan Lehnardt, Noah Slater, Christopher Lenz, J. Chris Anderson, Paul Davis, Adam Kocoloski, Jason Davies, Benoît Chesneau, Filipe Manana, Robert Newson|
|Developer(s)||Apache Software Foundation|
|Stable release||1.5.0 / November 5, 2013|
Unlike in a relational database, CouchDB does not store data and relationships in tables. Instead, each database is a collection of independent documents. Each document maintains its own data and self-contained schema. An application may access multiple databases, such as one stored on a user's mobile phone and another on a server. Document metadata contains revision information, making it possible to merge any differences that may have occurred while the databases were disconnected.
CouchDB implements a form of Multi-Version Concurrency Control (MVCC) in order to avoid the need to lock the database file during writes. Conflicts are left to the application to resolve. Resolving a conflict generally involves first merging data into one of the documents, then deleting the stale one.
Other features include document-level ACID semantics with eventual consistency, (incremental) MapReduce, and (incremental) replication. Administration is supported with a built-in web application called Futon.
CouchDB (Couch is an acronym for cluster of unreliable commodity hardware) is a project created in April 2005 by Damien Katz, formerLotus Notes developer at IBM. Damien Katz defined it as a "storage system for a large scale object database". His objectives for the database were to become the database of the Internet and that it would be designed from the ground up to serve web applications. He self-funded the project for almost two years and released it as an open source project under the GNU General Public License.
In February 2008, it became an Apache Incubator project and the license was changed to the Apache License. A few months after, it graduated to a top-level project. This led to the first stable version being released in July 2010.
Since the departure of Damien Katz, the Apache CouchDB project has continued, releasing 1.2 in April 2012 and 1.3 in April 2013. In July 2013, the CouchDB community merged the codebase for BigCouch, Cloudant's clustered version of CouchDB, into the Apache project. The BigCouch clustering framework is prepared to be included in an upcoming release of Apache CouchDB.
- Document Storage
- CouchDB stores data as "documents", as one or more field/value pairs expressed as JSON. Field values can be simple things like strings, numbers, or dates; but ordered lists and associative arrays can also be used. Every document in a CouchDB database has a unique id and there is no required document schema.
- ACID Semantics
- CouchDB provides ACID semantics. It does this by implementing a form of Multi-Version Concurrency Control, meaning that CouchDB can handle a high volume of concurrent readers and writers without conflict.
- Map/Reduce Views and Indexes
- Distributed Architecture with Replication
- CouchDB was designed with bi-direction replication (or synchronization) and off-line operation in mind. That means multiple replicas can have their own copies of the same data, modify it, and then sync those changes at a later time.
- REST API
- All items have a unique URI that gets exposed via HTTP. REST uses the HTTP methods POST, GET, PUT and DELETE for the four basic CRUD (Create, Read, Update, Delete) operations on all resources.
- Eventual Consistency
- CouchDB guarantees eventual consistency to be able to provide both availability and partition tolerance.
- Built for Offline
- CouchDB can replicate to devices (like smartphones) that can go offline and handle data sync for you when the device is back online.
CouchDB also offers a built-in administration interface accessible via web called Futon.
Use cases & production deployments
Replication and synchronization capabilities of CouchDB make it ideal for using it in mobile devices, where network connection is not guaranteed but the application must keep on working offline.
CouchDB is well suited for applications with accumulating, occasionally changing data, on which pre-defined queries are to be run and where versioning is important (CRM, CMS systems, by example). Master-master replication is an especially interesting feature, allowing easy multi-site deployments.
Enterprises that use CouchDB
A few examples of enterprises that used or are using CouchDB are:
- Ubuntu began using it in 2009 for its synchronization service "Ubuntu One" but stopped using it in November 2011.
- The BBC, for its dynamic content platforms
- Credit Suisse, for internal use at commodities department for their marketplace framework.
- Meebo, for their social platform (web and applications) - Meebo was acquired by Google and was shut down on July 12, 2012.
A more comprehensive list of software projects and web sites that use CouchDB is available on the Apache projects's wiki
Data manipulation: documents and views
CouchDB manages a collection of JSON documents. The documents are organised via views. Views are defined with aggregate functions and filters are computed in parallel, much likeMapReduce.
Accessing data via HTTP
Applications interact with CouchDB via HTTP. The following demonstrates a few examples using cURL, a command-line utility. These examples assume that CouchDB is running on localhost(127.0.0.1) on port 5984.
|Accessing server information|
|Creating a database named wiki|
|Attempting to create a second database named wiki|
|Retrieve information about the wikidatabase|
|Delete the database wiki|
|Create a document, asking CouchDB to supply a document id|
Open source components
CouchDB includes a number of other open source projects as part of its default package.
|ICU||International Components for Unicode (ICU) is an open source project of mature C/C++ and Java libraries for Unicode support, software internationalization and software globalization. ICU is widely portable to many operating systems and environments.||MIT License|
|OpenSSL||OpenSSL is an open source implementation of the SSL and TLS protocols. The core library (written in the C programming language) implements the basiccryptographic functions and provides various utility functions.||Apache-like unique|
|Erlang||Erlang is a general-purpose concurrent programming language and runtime system. The sequential subset of Erlang is a functional language, with strict evaluation, single assignment, and dynamic typing.||Modified MPL|