RavenDB #1 - Introdução

RavenDB #2 - Esquema dos documentos (13/11/2011)

Recentemente comecei a desenvolver um projecto com uns colegas em que praticamente todos os módulos vão ser desenvolvidos à base de gestão de conteúdos.
Como tenho ouvido falar bastante de RavenDB, e por ser uma base de dados orientada a documentos, decidi implementá-la neste projecto.

Assim vou começar a escrever uma série de artigos sobre RavenDB à medida que for desenvolvendo este projecto (e aprendendo mais sobre esta base de dados claro!).

Página do Projecto: http://ravendb.net/
Blog do Ayende (muitos artigos úteis!): http://ayende.com/blog 

O que é RavenDB?

Em primeiro lugar é importante referir que esta base de dados foi desenvolvida para a plataforma .NET.

Quem já lidou com ORMs (NHibernate, EF, etc) e recorreu a LINQ para escrever queries certamente vai-se adaptar bem à API do RavenDB. 

Ao contrário de SQL Server, MySQL, Oracle, etc, o RavenDB não é é uma base de dados SQL. Não contem o esquema típico de tabelas, relacionamentos entre tabelas, enfim, aquilo a que eu sempre me habituei quando ouvia a falar de Base de Dados! Ele armazena documentos no formato JSON, independentemente da estrutura deles (ou seja, não temos de obedecer à estrutura das tabelas por exemplo). Não lhe interessa se um documento tem ou não determinada propriedade. 

Para percebermos melhor isto vamos usar um cenário de um blog com artigos/comentários: numa base de dados SQL nós iríamos criar uma tabela para os artigos e outra tabela com os comentários dos artigos. Poderíamos também criar outra tabela para o rating dos artigos.
Um exemplo de um documento guardado do artigo seria algo semelhante a isto: 

{
  "Titulo": "Titulo do Artigo",
  "Corpo": "Corpo do Artigo",
  "DataCriacao": "0001-01-01T00:00:00.0000000+00:00",
  "Comentarios":
                {
                   "Autor" : "Nome do Autor",
                   "Corpo" : "Corpo do Comentário"
                },
                {
                   "Autor" : "Nome do Autor",
                   "Corpo" : "Corpo do Comentário"
                }
}

Nota: Para quem não está familiarizado com o formato JSON recomendo que leia este artigo: http://www.json.org/js.html

Além de  guardar o documento, o Raven guarda informações metadata. No exemplo que estamos a seguir, ele iria guardar:

Metadata
Raven-Entity-Name Artigo
Raven-Cl-Type Projecto.Entidades.Artigo, Projecto

Details
ETag (número!)
Last-Modified 9/28/2011 3:06:00 AM

(no final do artigo vou mostrar um exemplo para criar este documento com esta metadata).

Como já deu para perceber até este ponto, o Raven guarda documentos num formato válido JSON. Caso queiramos guardar dados binários podemos usar attachments (anexos).
Ao contário dos documentos, os anexos não são lidados como objectos num formato JSON (isto para não termos de codificar os dados binários para podemos guardar numa propriedade do documento, por exemplo uma fotografia).


Instalação do RavenDB

O meu primeiro comentário no Twitter relativamente ao RavenDB foi mesmo: First impression of #RavenDB: I love the simplicity of setting up an project w/ RavenDB. With a few lines of code i've got it running ;)

De facto é mesmo impressionante a facilidade com que conseguimos correr esta base de dados. Em três passos:

E voilá! A interface do RavenDB foi desenvolvida em Silverlight e é bastante atractiva e funcional. Na linha de comandos que é aberta conseguimos monotorizar os request à base de dados. Por defeito, o servidor vai correr na porta 8081
Se preferirem instalar a base de dados como um service do Windows basta executar o Raven.Server.exe com o parâmetro install (linha de comandos: RavenDB-Build-X\Server\Raven.Server.exe /install).

Exemplo Prático

Apesar de este artigo ser apenas uma introdução a esta base de dados vou deixar aqui um exemplo muito simples de como podemos inserir um novo documento. Daqui a poucos dias vou escrever mais a explicar isto.

public class RavenRepository
    {
        private static DocumentStore _documentStore;
        public static DocumentStore Document
        {
            get
            {
                if (_documentStore == null)
                {
                    _documentStore = new DocumentStore() { Url = "http://localhost:8081" };
                    _documentStore.Initialize();
                }
                return _documentStore;
            }
        }
    }
// ENTIDADES
public class Artigo
    {
        public string Titulo { get; set; }
        public string Corpo { get; set; }
        public DateTime DataCriacao { get; set; }
        public List<Comentario> Comentarios { get; set; }
    }
public class Comentario
    {
        public string Autor { get; set; }
        public string Corpo { get; set; }
    }
// CAMADA DE DADOS
public class ArtigoDAL
    {
    private DocumentStore _documentStore = RavenRepository.Document;
    public Output Add(Artigo obj)
        {
            using(var session = _documentStore.OpenSession())
            {
                session.Store(obj);
                session.SaveChanges();
            }
        }
    }

Aproveito também para deixar um link útil ;) http://ravendb.net/documentation/

Published 28-9-2011 1:13 por Guilherme Cardoso
Filed under:

Comments

# re: RavenDB #1 - Introdução

Boas,

Tenho seguido tb este blog e este projecto, mas, tem sempre o incoviniente de termos que ter acesso ao servidor e termos que executar algo nele. Este tipo de procedimento vai contra regras de segurança dos normais hostings que a que temos acesso.

Enfim.... :(

quinta-feira, 29 de Setembro de 2011 9:04 by Paulo Aboim Pinto

# re: RavenDB #1 - Introdução

Hey Paulo,

No projecto onde estou a implementar esta bd não tenho esse problema porque aluguei um servidor dedicado só para ele, mas acredito que vão aparecendo aos poucos mais ofertas de alojamento partilhado com a opção de RavenDB como bd visto ser open source ;)

quinta-feira, 29 de Setembro de 2011 9:59 by Guilherme Cardoso

# re: RavenDB #1 - Introdução

@Paulo não tenho a certeza mas acho que com o suporte para instalação em IIS do RavenDB consegues usa-lo em shared hosting.

@Guilherme teres a DAL a tratar de abrir e fechar a sessão a mim parece-me estranho. Terias uma camada de negócio por cima? Se sim, isso quer dizer que uma transação de negócio usará várias sessões, o que é um antipadrão por não aproveitar as funcionalidades de unit of work da sessão.

quinta-feira, 6 de Outubro de 2011 13:08 by Bruno Lopes

# re: RavenDB #1 - Introdução

Boas Bruno,

Por norma defino a transacção da camada DAL numa camada de negócio e é nessa camada que faço a gestão dessa transacção (apenas se for nula é que a crio na camada DAL e fecho-a logo).

Eu estou a acabar de escrever outro artigo onde já mostro como costumo lidar com a camada DAL e de negócio (já com os métodos CRUD herdados pelos documentos), se depois puderes dá umas sugestões para ver até que ponto devo continuar com este padrão que tenho usado ;)

quinta-feira, 6 de Outubro de 2011 13:41 by Guilherme Cardoso

# re: RavenDB #1 - Introdução

Ok, fico á espera da próxima edição então :)

terça-feira, 11 de Outubro de 2011 12:57 by Bruno Lopes

# RavenDB #2 - Esquema dos documentos da Base de Dados

Este artigo é uma continuação da minha aventura em RavenDB ! http://pontonetpt.org

quarta-feira, 12 de Outubro de 2011 23:52 by Guilherme Cardoso, Blog PT

Leave a Comment

(requerido) 
(requerido) 
 
(opcional)
(requerido) 
If you can't read this number refresh your screen
Enter the numbers above: