Publicado por Rafael Rosa em 06 de September de 2009

CouchRest – CouchDB sem frescuras

couchTenho pensando em utilizar bancos de dados baseados em documentos em meus aplicativos Ruby há alguns meses, talvez você se lembre do artigo sobre o MongoMapper em Junho, e tenho acompanhado a evolução do movimento No-SQL. A apresentação do George Palmer no Rails Underground sobre sua gem couch_foo me inspirou a explorar mais possibilidades, e recentemente comecei a incorporar o CouchDB em alguns dos projetos em que tenho trabalhado.

O que é um "banco de dados baseado em documentos" ?

O CouchDB é um dentre os vários bancos de dados baseados em documentos disponíveis, e seu principal concorrente é o MongoDB, sendo que há uma boa comparação entre ambos no website do Mongo. Os bancos baseados em documentos são uma espécie de ponte entre os tradicionais bancos de dados relacionais que possuem pilhas de funcionalidades (como por exemplo o MySQL e o Postgres) e bancos de dados chave-valor, que são rápidos e facilmente escaláveis (como por exemplo o Toyko Cabinet). Vale notar que não sou opositor ferrenho do SQL: trabalhei como DBA por algum tempo há alguns anos, e se tudo que você tem são dados relacionais com estruturas fixas e precisa de transações complexas, nada bate um velho e bom RDBMS.

No CouchDB e companhia, os dados são armazenados em documentos. Esses documentos não tem uma estrutura fixa, podem ter uma quantidade qualquer de propriedades, o que os tornam ideais para armazenar coleções de itens estruturados similares mas não idênticos. O CouchDB armazena dados como hashes JSON, e disponibiliza uma interface REST para criar, alterar ou pesquisar documentos.

Usando o CouchDB na sua aplicação Ruby App

Já mencionei o couch_foo como uma opção para interagir com o CouchDB a partir de uma aplicação Ruby app, mas após um pouco de pesquisa, decidi não utilizá-lo. Embora ele forneça uma interface bastante familiar, ao estilo ActiveRecord, e parece bem escrito, eu queria algo que se aproximasse um pouco mais da interface RESTful HTTP e JSON do Couch. Além disso, não estava convencido que utilizar o mesmo padrão do ActiveRecord para um banco de dados baseado em documentos fosse uma boa pedida. Também experimentei a biblioteca couch_potato do Alex Lang, mas acabei ficando com o CouchRest.

CouchRest

O CouchRest é uma fina camada sobre a API HTTP do CouchDB (utilizando o RestClient, a camada de abstração HTTP em Ruby utilizada pelo Heroku), que fornece um framework simples e independente do Object-Mapper para construir sua aplicação. Tudo funciona como experado: os objetos JSON que são enviados como resposta das queries do CouchDB são transformados em objetos baseados em hashes do Ruby.

Modelos, propriedades e views

Com o CouchRest, você pode definir modelos para seus documentos que compartilham estruturas similiares, derivando-os de CouchRest::ExtendedDocument. Propriedades comuns a todos os modelos podem ser declaradas com método property do CouchRest. Ele também suporta a criação automática das proprieades created_at e updated_at, callbacks e validações.

No Couch, você pesquisa e filtra dados através de views. Elas são declaradas usando funções map-reduce em Javascript que iteram por todos os documentos do banco, construindo uma lista chave-valor ordenada. O CouchRest permite a criação de views simples em Ruby, de forma que você seja capaz de pesquisar documentos por propriedades. Se precisar de mais controle, também é possível passar Javascript puro ao método.

class Article < CouchRest::ExtendedDocument
  include CouchRest::Validation

  property :date
  property :title
  property :slug

  view_by :slug

  validates_present :title

  timestamps!

  save_callback :before, :generate_slug_from_title

  def generate_slug_from_title
    self.slug = title.downcase.gsub(/[^a-z0-9]/,'-').squeeze('-').gsub(/^-|-$/,'') if new?
  end
end

Espero que esse artigo tenha sido uma boa amostra do que o CouchDB pode fazer, e onde ele pode ser utilizado, e como o CouchRest pode ajudá-lo a integrá-lo em suas aplicações Ruby. Obviamente, o assunto é muito mais extenso do que o apresentado aqui, mas esse livro online da O'Reilly (em fase de rascunho) é um bom lugar para começar a aprender sobre o CouchDB e ele tem como co-autor J. Chris Anderson, autor do CouchRest.

Nota do tradutor: O Luiz Aguiar me indicou um projeto no Github do Alexander Lang que compara as várias implementações das bibliotecas de acesso ao CouchDB em Ruby, clique aqui para ir ao repositório. Também gostaria de indicar o screencast do Peepcode sobre o assunto, é bem interessante e também utiliza o CouchRest.

2 Comentários para “CouchRest – CouchDB sem frescuras”

  1. #1
    Leandro Silva Disse:

    Fala Rafael! Legal você trazer esse post pro RubyInsede Brasil. Aliás, legal não, ótimo!

    Tem também uma discussão bacana aqui:
    http://guj.com.br/posts/list/136505.java

    Abraço!

  2. #2
    CouchDB – Resolvendo problemas reais « Papo de Corredor Disse:

    [...] pensei, uma coisa leva a outra e então acabei encontrando o aqui o CouchRest, e acabei caindo mais aqui e [...]

Deixe um Comentário