# CouchDB

Apache CouchDB, comumente referido como CouchDB, é um banco de dados de código-aberto que foca na facilidade de uso e na filosofia de ser "um banco de dados que abrange a Web". É um banco de dados não-relacional (NoSQL) que usa JSON para armazenar os dados, JavaScript como sua linguagem de consulta usando o MapReduce, e HTTP como API. Uma de suas características marcantes é a facilidade na replicação. CouchDB foi lançado em 2005, e em 2008 tornou-se um projeto da Apache Software Foundation.
Ao contrário de um banco de dados relacional, o CouchDB não armazena os dados e relacionamentos em tabelas. Cada banco de dados é uma coleção de documentos independentes, e cada documento mantém seus próprios dados e esquemas. Uma aplicação pode acessar vários bancos de dados, por exemplo, no smartphone do usuário e outro em um servidor. Os metadados do documento contém informações de revisão, possibilitando mesclar quaisquer diferenças que possam ter ocorrido enquanto os bancos de dados estavam desconectados.
CouchDB implementa uma forma de Controle de concorrência multiversão (MVCC), a fim de evitar a necessidade de travar o arquivo de banco de dados durante as gravações. Os conflitos são deixados para a aplicação de resolver. Resolver um conflito geralmente envolve primeira mesclagem de dados em um dos documentos, apagando o antigo.
Outras características são a semântica ACID com consistência posterior, MapReduce, replicação incremental e tolerância a falhas. A administração é suportada com uma aplicação web embutida chamado Futon.

## Histórico

CouchDB (Couch é um acrônimo para Cluster of Unreliable Commodity Hardware) é um projeto criado em abril de 2005 por Damien Katz, ex-desenvolvedor da IBM. Damien Katz o definiu como "sistema de armazenamento de bancos de dados para objetos de larga escala". Seu objetivo é tornar o CouchDB um banco de dados para a Internet, voltado à aplicações web. Ele manteve o projeto por quase dois anos, então liberou como código-aberto sob a GNU General Public License.
Em fevereiro de 2008, se tornou um projeto da Incubadora de projetos Apache e sua licença mudou para a Licença Apache. Alguns meses depois, se tornou um projeto de alto nível. Isso levou à primeira versão estável, liberada em julho de 2010.
Em meados de 2012, Damien Katz deixou o projeto para se focar no Couchbase. O projeto foi continuado, e a versão 1.2 foi lançada em abril de 2012.

## Principais características
### Armazenamento em documentos

    CouchDB armazena os dados como "documentos", com um ou mais pares de campo/valor, expressos em JSON. Os valores do campo podem ser string, números ou datas, além de arrays e vetores associativos. Todo documento no banco de dados do CouchDB tem uma id única e não há necessidade de um esquema.

### Semântica ACID

    CouchDB provê semântica ACID. Isso é possível graças ao Controle de concorrência multiversão, que permite que o CouchDB manipular um grande volume de leituras e escritas simultâneas sem conflitos.

### Views e índices com Map/Reduce

    Os dados armazenados são estruturados usando-se views. No CouchDB, cada view é construída por uma função em JavaScript que atua como a operação Map do MapReduce. Essa função transforma um documento em um único valor, que é retornado na forma de índice. O CouchDB indexa as views e os mantém atualizados enquanto os documentos são adicionados, removidos ou atualizados.

### Arquitetura distribuída com replicação

    O CouchDB foi desenvolvido com replicação bidirecional (ou sincronização) e operação off-line. Isso significa que múltiplas réplicas podem ter suas cópias do mesmo dado, modificá-los e sincronizá-los mais tarde.

### API REST

    Todos os itens têm uma URI exclusiva, que são acessadas através do HTTP. O REST utiliza os métodos POST, GET, PUT, DELETE para as operações CRUD (Create, Read, Update, Delete) em todos os recursos.

### Consistência posterior

    O CouchDB garante a consistência posterior para prover disponibilidade e tolerância à falhas.