CouchDB, um banco de dados NoSQL, serverless e com sincronização offline
O CouchDB é um banco de dados especial, com funcionalidades que nenhum outro banco de dados oferece nativamente.
O seus diferenciais são: permitir sincronização master master de forma fácil e nativa entre um ou mais servidores CouchDBs, trabalhar com dados no formato JSON e ser orientado a documentos (como o MongoDB), em modo Cluster/BigCouch fazer sharding automático dos dados (distribuindo a carga entre vários servidores), permitir aplicações receber atualizações do banco em tempo real (uma forma de mensagens push, streaming contínuo), forma acesso via protocolo HTTP 1.1 (sem necessidade de drivers, puro REST), e por consequência, permitir o Front-End Web (SPA, Angular, React, VUE, JQuery, AJAX) se comunicar diretamente com o banco, sem necessidade de backend, e permitir criar aplicações offline-first.
Um tutorial introdutório muito bom é o A Pokemon Crash Course on CouchDB, nele aprendemos como fazer coisas básicas e importantes no CouchDB.
Também há um tutorial escrito por um dos criadores do CouchDB. Esse tutorial é mais completo contém trechos do livro mais completo de CouchDB, mas não contém tudo que tem no livro (isca pra comprar o livro). O livro é certamente a introdução mais completa que você pode ter.
Outra alternativa é usar a documentação do CouchDB. A documentação com certeza é o lugar mais completo pra se ter informações, só que não necessariamente as coisas estarão do jeito mais didático.
Ferramentas e Bibliotecas que trabalham bem com o CouchDB
PouchDb
RxDB
Cloudant Java SDK
Cloudant Node SDK
Cloudant Python SDK
Cloudant Go SDK
(Descontinuadas...):
Cloudant Sync Android
Cloudant Sync Java SE
Couchbase Lite 1.3
Instalando o CouchDB
Instalando via Docker
sudo docker run -d --hostname couchdb --name couchdb --restart unless-stopped -p 5984:5984 -p 4369:4369 -p 5986:5986 couchdb
Pra que servem essas portas?
5984 é a porta padrão para comunicação com o CouchDB. É através dela que você poderá fazer consultas no banco de dados e acessar o Futon (painel de administração do CouchDB).
4369 é a porta que CouchDB usa para se comunicar com outros CouchDBs em modo cluster. Você só precisará desta porta se quiser usar o CouchDB em modo cluster.
5986 é a porta para gerenciamento interno do banco de dados, usada apenas pelo administrador do banco de dados. Você só precisará dela se quiser fazer alguma tarefa avançada de gerenciamento do CouchDB. Não exponha essa porta publicamente porque é possível alterar configurações de funcionamento do banco através dela sem precisar se autenticar.
Instalando via Apt
Visualizando Dados Salvos
Por GET
O GET permite visualizar um documento apenas.
- Se você tem o id do documento, pode informá-lo ao CouchDB e obter os dados e o id da última versão salva.
- Se você tem o id do documento e o id da versão, pode obter os dados referentes a ele.
Por Views
As Views são formas de fazer consultas customizadas no CouchDB. Ao criar uma View, índices são criados, o que otimiza seu acesso.
Como arquitetar suas Views? Há alguma receita que ajude?
https://www.lullabot.com/articles/a-recipe-for-creating-couchdb-views
Como fazer um filtro por data?
https://dzone.com/articles/multiple-search-keys-in-couchdb
Outro exemplo de criação de Views.
https://medium.com/ibm-watson-data-lab/creating-partial-cloudant-indexes-1ebf169c8e15
Pelo Mango
O Mango é uma linguagem de query semelhante à usada no MongoDB. Ela dá facilidade para acessar os dados. Tomar cuidado com o Mango pois ainda não é uma função madura e otimizada o suficiente no CouchDB.
Recebendo atualizações do banco de dados em tempo real, CHANGES FEED!
Para receber atualizações do "seu-banco-de-dados" em tempo real basta fazer a seguinte requisição HTTP GET:
https://localhost:5984/seu-banco-de-dados/_changes?feed=continuous&heartbeat=20000&include_docs=true# include_docs = true fará o documento ser recebido por completo, e não apenas seu id# feed = continuous faz esta requisição ficar rodando indefinidamente, até que ocorra o timeout da requisição# heartbeat = 20000 faz com que um heartbeat seja enviado a cada 20 segundos, impedindo também que ocorra timeout da requisição, deixando a conexão aberta indefinidamente
É importante dizer que se esse banco necessitar de autenticação para ser acessado, a data de expiração do cookie poderá impedir o recebimento de novas mensagens, embora o cliente continue esperando atualizações.
Usando o id dos documentos de forma eficiente
Você pode fazer relações de 1 para n e n para n no CouchDB apenas usando os IDs dos documentos de forma inteligente e padronizada:
https://github.com/jo/couchdb-best-practices#embrace-the-document-id
Usando o CouchDB de forma Serverless e Segurança
O CouchDB permite criarmos aplicações sem precisarmos de um backend. Isso significa que podemos usar JavaScript no browser para acessar diretamente o banco de dados. Isso é muito bom e traz uma rapidez enorme no desenvolvimento, mas... O CouchDB precisa ser configurado pra isso, senão usuários diferentes do seu software poderão acessar dados das outras pessoas.
Quais são os tipos de usuários no CouchDB?
O CouchDB tem 2 tipos de usuários a nível de servidor:
(documentação oficial)
- Usuário tipo Administrador do Servidor ou Super Usuário
- Usuário tipo Comum
O usuário tipo Administrador do Servidor pode:
- Criar bancos de dados
- Apagar bancos de dados
- Alterar o documento _security de um banco de dados
- Criar/Apagar/Deletar um documento _design (design document)
- Ativar compactação de um banco de dados
- Ler a lista de tarefas ativas
- Reiniciar o servidor
- Ler/Alterar configuração do servidor
Um usuário Comum pode:
[Em construção...]
O CouchDB tem 2 tipos de usuários a nível de banco de dados:
Membros - podem ler, criar e modificar qualquer documento (exceto design documents)
Administradores - podem ler, criar e modificar todos os tipos de documentos, alterar permissões e configurações do banco de dados.
Ao criar um banco de dados novo você precisa criar um documento _security. Isso impedirá que usuários não autenticados acessem o banco. A documentação oficial do documento _security é essa.
Como dar permissões de leitura apenas?
Há diferentes formas de se conseguir isso, apesar de todas elas seguem um princípio parecido, usando os documentos _security e _design.
Métodos de autenticação do pessoal do PouchDB
https://github.com/pouchdb-community/pouchdb-authentication/blob/master/docs/recipes.md
Método do Eiri
https://medium.com/@eiri/couchdb-authorization-in-a-database-58c8ee633c96
https://medium.com/@eiri/couchdb-authorization-in-nutshell-5ae697fe9a
Método do James Adam
https://jamesadam.me/2014/11/09/couchdb-authorization/
Método do manage_couchdb
Documentação do método no GitHub
https://github.com/iriscouch/manage_couchdb
Exemplo de validation function
https://github.com/iriscouch/manage_couchdb/blob/master/js/validate_doc_update.js
A base dos métodos: Validation Function
CouchDB Guide
http://guide.couchdb.org/draft/validation.html
CouchDB Documentation
https://docs.couchdb.org/en/stable/ddocs/ddocs.html#validate-document-update-functions
https://stackoverflow.com/questions/10713437/couchdb-wide-read-only-access-rights
http://guide.couchdb.org/draft/security.html
Referências em Serverless CouchDB
https://www.joshmorony.com/creating-a-multiple-user-app-with-pouchdb-couchdb/
Replicação
Filtered Replication
https://thinkinginsoftware.blogspot.com/2011/10/couchdb-filtered-replication.html
Como o CouchDB funciona?
Esse artigo de blog explica muito bem várias características do CouchDB, inclusive sobre performance e fazendo analogias do CouchDB com o SQL.
A analogia mais interessante foi:
databases (bancos de dados) no CouchDB são como tabelas no SQL
views (visualizações) no CouchDB são como índices num banco de dados SQL.
O que todo desenvolvedor precisa saber sobre CouchDB
https://www.dimagi.com/blog/what-every-developer-should-know-about-couchdb/
https://forums.couchbase.com/t/filtering-data-based-on-datetime/366
Tutorial CouchDB + PouchDB
Esse tutorial mostra como é feita a conexão do CouchDB com o PouchDB.
https://dzone.com/articles/beginners-guide-to-pouchdb
Ao usar o PouchDB você usará um banco de dados no browser para armazenar os dados. Por padrão, o PouchDB usa o IndexedDB, é o mais atual e performático, mas também é possível usar o WebSQL, o SQLite ou o NodeWebSQL. Todas as opções de bancos locais estão aqui.
O IndexedDB têm uma limitação de armazenar até 40mb de dados. Acima disso o usuário precisará dar permissão por meio de um popup para que mais espaço seja usado.
Criando uma aplicação Angular com PouchDB
# Instalando o Angular Command Line Interfacenpm install -g @angular/cli # Criando um app novo chamado angular-pouchdb ng new angular-pouchdb cd angular-pouchdb # Instalando pouchdb com suporte ao typescript npm install pouchdb @types/pouchdb # Rodando seu app localmente ng serve
Testando o PouchDB dentro de um componente
constructor(){let db = new PouchDB('http://admin:admin@localhost:5984/hello'); db.info().then(function (info) { console.log(info); }); }
Referências
Drivers para CouchDB
Python CouchDB e Cloudant (oficial)
https://github.com/cloudant/python-cloudant/blob/master/README.md
Artigos
https://www.javacodegeeks.com/2013/08/couchdb-relax.html
Configurando CouchDB com vários clusters
https://www.scaleway.com/en/docs/installation-configuration-couchdb-cluster-on-ubuntu/
CouchDB para IoT
http://ashishware.com/CouchDbIot.shtml
https://bsmulders.com/2017/06/serverless-iot/
Introdução definitiva ao CouchDB
https://www.infoq.com/articles/apache-couchdb-the-definitive-introduction/
c