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/