RavenDB - Introdução

2/28/2012 11:30:00 PM By Felipe Pessoto

Nos últimos anos tem se falado muito sobre NoSQL, sobre os ganhos em performance, escalabilidade, simplicidade, etc. Ele não veio para substituir os bancos relacionais, mas é mais uma alternativa a se considerar. Na verdade usamos bancos relacionais como bala de prata, simplesmente porque eles estão lá, é praticamente uma regra, mas nem sempre são a melhor opção. Como disse Abraham Maslow, "Para quem só sabe usar martelo, todo problema é um prego."

O RavenDB é especial para desenvolvedores .NET pois é feito em .NET e Open Source. O que não quer dizer que ele é de graça, caso você queira usar em algum produto comercial você precisa comprar uma licença, mas não se preocupe pois é muito barata em comparação aos bancos relacionais e o ganho em produtividade paga o custo rapidamente.

Além disso, como é destacado no logo, ele é um banco de dados orientado a documentos de 2ª geração. Entre suas vantagens podemos destacar:

  • ACID
  • Sem Locking
  • Seguro
  • API amigável
  • LINQ
  • Compatível com DDD(Aggregates)
  • Multi-Level cache
  • Escalável
  • Schema Free
  • Sharding
  • Replication
  • Full Text Seach (contruido com Lucene)
  • Entre muitos outros...

Neste post introdutório quero apenas mostrar (enquanto aprendo) como fazer um projeto bem simples, apenas gravando e lendo um documento no banco.

Criei um website vazio pra usar como teste e pelo NuGet você pode instalar o RavenDB-Embedded, que roda junto com o site em vez de instalar um serviço.

O primeiro passo é criar uma instância Singleton do DocumentStore, isso pode ser feto facilmente com uma variavel static readonly, ou como no meu caso eu uso o Global.asax, no Application_Start crio uma instancia que é usada até o site ser reciclado ou parado:

    private static IDocumentStore DocumentStore { get; set; }
    void Application_Start(object sender, EventArgs e)
    {
        DocumentStore = new EmbeddableDocumentStore
        {
            DataDirectory = "Data",
            UseEmbeddedHttpServer = true
        }.Initialize();
    }

O DocumentStore será usado pra criar um IDocumentSession quando acessarmos o banco de dados. O IDocumentSession representa um Unit Of Work. Para facilitar criamos uma Sessão no inicio de cada Request no Global.asax e colocamos no dicionário Items do Request. A melhor forma de fazer isso depende da sua aplicação, você poderia usar um IoC, ou criar a Sessão toda vez que quiser usar o banco, é mais ou menos como fazemos com o DbContext ou ObjectContext do Entity Framework.

    void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Items["CurrentRequestRavenSession"] = DocumentStore.OpenSession();
    }

A API básica é bastante simples e é algo que o Ayende valoriza muito, para ter uma idéia são apenas 6 métodos.
Para gravar um novo objeto não poderia ser mais simples, apenas duas linhas:

Livro novoLivro = new Livro
                        {
                            Nome = TxtNome.Text,
                            Preco = decimal.Parse(TxtPreco.Text),
                            Autores = TxtAutores.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                        };
RavenSession.Store(novoLivro);
RavenSession.SaveChanges();

Com a mesma facilidade podemos fazer as outras operações, como consultar um documento pelo Id:

Livro livroEditado = RavenSession.Load<Livro>("livros/" + HidId.Value);

Atualizar:

Livro livroEditado = RavenSession.Load<Livro>("livros/" + HidId.Value);
livroEditado.Nome = TxtNome.Text;
livroEditado.Preco = decimal.Parse(TxtPreco.Text);
livroEditado.Autores = TxtAutores.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
RavenSession.SaveChanges();

Apagar um documento:

Livro livroApagado = RavenSession.Load<Livro>("livros/" + id);
RavenSession.Delete(livroApagado);
RavenSession.SaveChanges();c

E uma Query simples:

GrvTodos.DataSource = RavenSession.Query<Livro>();

Isso é o básico, o RavenDB tem muitos recursos avançados que pretendo falar nos próximos posts, a medida que vou me familiarizando com este excelente Document DB.

Caso queira testar, estou disponibilizando o código que usei. Para se ter uma idéia, a maior parte do código é pra controlar os Controles do Form do que o banco de dados em si.

RavenDbIntroducao.zip