Uma introdução ao RavenDB

ravendb

  • O que é

O RavenDB é um NoSQL desenvolvido em .net, open source e mantido por uma equipe de peso, que inclui desenvolvedores como Oren Eini, Federico Lois, Elemar Júnior, etc. Você pode clicar aqui e conferir a equipe completa.

Por ser um banco de dados desenvolvido em .net e por pessoas envolvidas na comunidade .net, ele possui uma integração muita boa com o ambiente Microsoft, permitindo fazer queries utilizando LINQ de maneira muito simples. Porém ele não fica restrito ao ambiente Microsoft. Ele possui uma api rest que permite realizar queries, inserts, etc. a partir de qualquer linguagem e/ou ferramenta, como o postman.

O intuito deste post não é falar que o Raven é a bala de prata, que é melhor que outros bancos como o CouchDB ou o Mongo. Muito menos para compará-lo com outros tipos de bancos como o SQL Server ou Postgre. É válido para posts futuros compará-lo com outros bancos, analisar em quais casos um pode ser uma melhor escolha que o outro, porém neste post, vamos ficar apenas com a introdução.

  • Documentos

O RavenDB trabalha com documentos. Tudo o que você insere é salvo em formato JSON. Isso quer dizer que se você possui uma classe:

public class User 
{
    public string Name { get; set; }
    public string Email { get; set; }
}

Ao salvar este objeto no Raven, ele será salvo no formato:

{
    "Nome": "Rafael",
    "Email": "email@email.com"
}

Isso quer dizer que no lugar de possuir uma tabela com diversas linhas de registros organizados em colunas, você terá uma coleção de documentos no formato json.

  • Indexes

Um ponto muito importante para começar utilizar o RavenDB é entender que ele não realiza scan nos documentos. Utilizando o exemplo do bootcamp da raven:

Isso:

var orders = (
    from order in session.Query<Order>()
    where order.Company == "companies/1"
    orderby order.OrderedAt
    select order
    ).ToList();

Não é traduzido em algo como:

var results = new List<Order>();

foreach (var o in GetDocumentsFor("Orders")) {
    if (o.Company == "companies/1")
        results.Add(o);
}

var orderedResults = results.Sort( (a,b) => a.OrderedAt.CompareTo(b.OrderedAt));

Uma das premissas do Raven é performance, e apesar do table scan funcionar bem para quantidades pequenas de dados, isso não funciona quando você está trabalhando com um volume muito grande de informações. Isso quer dizer que como ele nunca realizará um table scan, ele utiliza Indexes para otimizar a consulta.

Internamente, ele utiliza o Lucene para indexar e otimizar as consultas. Isso não quer dizer que você precisa conhecer o Lucene para começar a utilizar o Raven, porém é interessante se aprofundar no assunto na medida que você começar utilizá-lo em seus projetos.

Mas você precisa criar indexes para todas as consultas? Na verdade não. O Raven possui a inteligência de verificar se existe algum index criado que possa ser utilizado para a consulta em questão. Caso não exista um, ele criará o index para você. É importante ressaltar que caso você tenha conhecimento que uma determinada query será realizada, é uma boa prática você criar esse index, tanto por controle do que você está fazendo, quanto por performance na hora da consulta.

É possível criar Indexes tanto através do Management Studio do Raven, quanto pelo código. O código de um index é bem simples, e fica mais ou menos assim:

public class Users_ByEmail : AbstractIndexCreationTask<User>
{
    public Users_ByEmail()
    {
        Map = (users) => 
            from user in users
            select new
            {
                Email = user.Email
            };
    }
}

Utilizando a minha liberdade poética, imagine que criar este index seria algo semelhante ao exemplo abaixo caso você estivesse utilizando diretamente o Lucene:

var document = new Lucene.Net.Documents.Document();

document.Add(new Lucene.Net.Documents.Field("Email", "Email", Field.Store.YES, Field.Index.ANALYZED));

E isso faz toda a diferença entre você esperar vários segundos, ou até minutos, ou esperar alguns milissegundos para obter o resultado de uma query.

Bom, por hoje é  só. Nos próximos posts vamos nos aprofundar mais no raven, criar exemplos de queries, insert, etc. 😀

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s