CouchRest ExtendedDocument – Queries Básicas

Em ruby temos algumas gems para serem utilizadas com o CouchDB. Particularmente eu prefiro a gem CouchRest, construída pelos commiters do CouchDB (Chris Anderson é um deles). E um dos commiters do CouchRest (que vem fazendo um excelente trabalho) é o Marcos Tapajos da Improve IT e RedeParede.
Para saber mais como instalar e utilizar o CouchRest acesse a wiki no Github.

Vamos considerar a seguinte classe (Post) que herda ExtendedDocument da gem CouchRest

class Post < CouchRest::ExtendedDocument
  use_database DB #constante com as infos do seu banco

  property :titulo
  property :conteudo

  #será criado no banco uma view pelo título
  view_by :titulo

end

Carregando todos os documentos com o “couchrest-type” Post

@posts = Post.all
puts @posts.inspect

Carregando um documento pelo ID

#Sem excessões caso o documento não seja encontrado
@post = Post.get("id_do_documento")
puts @post.inspect

#Será gerado uma excessão se o documento não for encontrado
@post = Post.get!("id_do_documento")
puts @post.inspect

Utilizando Views

A view criada pelo CouchRest

function(doc) {
  if ((doc['couchrest-type'] == 'Post') && doc['titulo']) {
    emit(doc['titulo'], null);
  }
}
#Carregando todos do documentos com "couchrest-type" Post e que tenham um título
@posts = Post.by_titulo
puts "O número de posts encontrados foi #{@posts.count}"
puts
puts @posts.inspect

#Carregando todos do documentos com "couchrest-type" Post e um título específico
@posts = Post.by_titulo(:key => "Um título em específico")
puts @posts.inspect

CouchDB 0.11.0

Ontem foi lançada a versão 0.11 do CouchDB que é a base antes da versão 1.0.
Algumas das melhorias foram:

Adicionado suporte a instalador Windows
Melhora nas views
Correção de bugs na construção de views
Melhorias nos cálculos de estatísticas
Melhorias de velocidade e concorrência em pesquisas
Corrigido timeout de HTTP para replicação
Melhorias no Futon UI
Melhorias nos anexos (attachments)
Melhorias na autenticação
Adicionado um manipular de reescrita de url
Adicionado um manipulador de atenticação de proxy
Adicionado habilidade de replicar documentos pelo ID
Adicionado a criação de virtual hosts

São muitas as melhorias que a equipe do CouchDB vem realizando, com certeza o projeto está bem próximo da maturidade para a versão 1.0

Propriedades ACID

Ultimamente escrevi alguns posts sobre o CouchDB, um deles referente as propriedades ACID.
As propriedades ACID (atomicidade, consistência, isolamento e durabilidade) são fundamentais nos bancos de dados, sejam os relacionais ou os orientados a documentos. Então, também é valido tratarmos desse assunto referente aos bancos relacionais, em um contexto geral.
Atualmente os sistemas de informação suportam vários usuários. O banco de dados tem que garantir a confiabilidade nas transações, haja vista que muitas podem ocorrer concorrentemente.

O que é uma transação?

Uma transação é um programa em execução que forma uma unidade lógica de processamento no banco de dados. Uma transação inclui uma ou mais operações de acesso ao banco de dados — englobam operações de inserção, exclusão, alteração ou recuperação. *

Por que a Restauração (Recuperação) é Necessária?

O sistema deverá garantir que: (1) todas as operações na transação foram com­pletadas com sucesso e seu efeito será gravado permanentemente no banco de dados ou (2) a transação não terá nenhum efei­to sobre o banco de dados ou sobre quaisquer outras transações. *

Atomicidade
A propriedade de atomicidade garante que as transações sejam atômicas (indivisíveis). A transação será executada totalmente ou não será executada.

Consistência
A propriedade de consistência garante que o banco de dados passará de uma forma consistente para outra forma consistente.

Isolamento
A propriedade de isolamento garante que a transação não será interferida por nenhuma outra transação concorrente.

Durabilidade
A propriedade de durabilidade garante que o que foi salvo, não será mais perdido.

* Algumas respostas foram retiradas do livro: Sistemas de banco de dados – Ramez Elmasri e Shamkant B. Navathe.

Compactar banco de dados – CouchDB

O CouchDB assim como alguns bancos relacionais (MySQL, Postgre, Oracle etc) utiliza o modelo MVCC (Multiversion concurrency control), então quando um documento recebe uma atualização, é criada uma nova versão do documento.

Devido ao fato da criação de novas versões, seu banco de dados pode começar a crescer exponencialmente. Então você pode compactar o banco, para economizar certo espaço em disco. A compactação comprimi o arquivo de banco de dados removendo seções não utilizadas que foram criadas durante as atualizações.

A compactação pode ser feita enviando uma requisição HTTP Post para o “sub recurso” _compact do seu banco. Em caso de sucesso um status HTTP 202 é retornado.

curl -X POST http://localhost:5984/meu_banco/_compact
#=> {"ok":true}

Você pode verificar informações sobre sua base (inclusive se uma compactação está ocorrendo) enviando uma requisição HTTP Get ao banco.

curl -X GET http://localhost:5984/meu_banco
#=> {"db_name":"meu_banco", "doc_count":334, "doc_del_count":0, "update_seq":5329, "purge_seq":0, "compact_running":false, "disk_size":614498, "instance_start_time":"1267717198892433", "disk_format_version":4}

É recomendado que a compactação seja feita em um horário em que o CouchDB não receba muitas escritas.