Carregando...
Banco de DadosCouchDB

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 Interface
npm 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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *