Este artigo é uma continuação da minha aventura em RavenDB! http://pontonetpt.org/blogs/guilhermecardoso/archive/2011/09/28/ravendb-1-introdu-231-227-o.aspx
Algo que referi no primeiro artigo foi que toda esta ideia de uma bd não relacional, para alguém como eu que só viu sql server e mysql à frente, foi um bocado complicada de perceber, Por isso achei melhor mostrar primeiro um modelo um pouco mais complexo, para também ouvir a opinião de quem já tenha implementado esta base de dados em projectos "reais" e saber se já consegui apanhar bem o conceito!
No primeiro artigo apenas usei um esquema para Newsletters e Comentários. Como os exemplos que tenho visto na net são à base de blogues e lojas de comércio electrónici, neste artigo vou fazer o esquema para uma liga de desporto.
A informação que temos de guardar ér:
- Detalhes de todas Jornadas (nº da jornada, descrição geral)
- Resultados dos jogos de todas as Jornadas (incluindo que equipa jogou contra qual, e quais os detalhes de cada uma das equipas nesse jogo)
- Classificacao das equipas do final de cada jornada
- Melhores marcadores de cada jornada
- Todas as equipas registadas na liga
Neste contexto imaginei uma liga de futebol e o esquema numa base de dados SQL que me lembrei foi este:

Podia ser criada uma tabela de Jogos com os campos Id, Data, Descricao e depois outra tabela de JogosDetalhes com os campos: IdEquipa, GolosMarcados, GolosSofridos, FaltasCometidas, FaltasSofridas, CartoesAmarelos, Cartões vermelhos, Fora (boleano para sabermos se a equipa jogou fora ou em casa). Esta alternativa implicaria o uso de mais uma tabela, e consequentemente mais uniões nas consultas. E neste esquema, cada Jogo apenas teria duas referências a registos da tabela JogosDetalhes (o que não justifica muito a criação de mais uma tabela).
Podem haver outros esquemas mais eficientes e estruturados que este, mas a questão aqui não é essa.
Tentando passar isto para uma esquema para integrar no RavenDB este foi um dos esquemas que mais me pareceu eficiente.
Um exemplo de uma jornada seria este (apenas meti quatro equipas para não ficar demasiado longo no ecrã):

{
NumeroJornada : 1,
Classificacao : [
{ Posicao : 1, IdEquipa : "1", NomeEquipa : "Sporting CP", Pontos : 21, GolosMarcados : 30, GolosSofridos: 12},
{ Posicao : 2, IdEquipa : "2", NomeEquipa : "FC Porto", Pontos : 20, GolosMarcados : 30, GolosSofridos: 12},
{ Posicao : 3, IdEquipa : "4", NomeEquipa : "SL Benfica", Pontos : 15, GolosMarcados : 30, GolosSofridos: 12},
{ Posicao : 4, IdEquipa : "3", NomeEquipa : "Braga", Pontos : 214, GolosMarcados : 30, GolosSofridos: 12}
],
MelhorMarcadorDaJornada : [
{ Posicao : 1, IdEquipa : "1", Nome : "Nuno", Golos : 10},
{ Posicao : 2, IdEquipa : "2", Nome : "Rui", Golos: 9}
],
DescricaoGeral : "Descrição Geral da Jornada",
Jogos : [
{Data : "12/12/2012",
Descricao : "Descrição Geral do Jogo",
Duracao : "93:24",
EquipaCasa : {
Id : "1",
Nome : "Sporting Clube Portugal",
GolosMarcados : 2,
GolosSofridos : 3,
CartoesAmarelos : 0,
CartoesVermelhos : 0,
FaltasCometidas : 2,
FaltasSofridas : 1
},
EquipaFora : {
Id : "2",
Nome : "Futebol Clube do Porto",
GolosMarcados : 2,
GolosSofridos : 3,
CartoesAmarelos : 0,
CartoesVermelhos : 0,
FaltasCometidas : 2,
FaltasSofridas : 1
},
},
{Data : "12/12/2012",
Descricao : "Descrição Geral do Jogo",
Duracao : "93:24",
EquipaCasa :{
Id : "3",
Nome : "Sport Lisboa Benfica",
GolosMarcados : 2,
GolosSofridos : 3,
CartoesAmarelos : 0,
CartoesVermelhos : 0,
FaltasCometidas : 2,
FaltasSofridas : 1
},
EquipaFora : {
Id : "4",
Nome : "Braga",
GolosMarcados : 2,
GolosSofridos : 3,
CartoesAmarelos : 0,
CartoesVermelhos : 0,
FaltasCometidas : 2,
FaltasSofridas : 1
},
}
]
}
Cada documento de Jornada pode parecer um pouco grande, mas eu desenhei esta estrutura para conseguir em client side visualizar jornada a jornada, e em cada uma ter logo "acessíveis" todas as informações sobre elas (após o objecto estar no lado do cliente, o resto é js para brincar com os dados!)
O documento de cada equipa seria algo do gênero:

{[
{Id : "1", Nome : "Sporting Clube Portugal", AnoFundado : "1906"}
]
A início não pensei neste esquema. Enquanto estava a desenhar a base de dados, continuava a pensar em relacionamentos e chaves primárias, que acabei por desenhar algo semelhante a ter um documento para cada tabela!
Para guardar estes documentos, as entidades poderiam ficar algo assim:
public class Jornada
{
public int NumeroJornada { get; set; }
public List<Classificacao> Resultados { get; set; }
public List<MelhorJogadorDaJornada> MelhoresJogadores { get; set; }
public List<Jogos> Jogos { get; set; }
}
public class Classificacao
{
public int Posicao { get; set; }
public int IdEquipa { get; set; }
public string NomeEquipa { get; set; }
public int pontos { get; set; }
public int GolosMarcados { get; set; }
public int GolosSofridos { get; set; }
}
public class MelhorJogadorDaJornada
{
public int Posicao { get; set; }
public int IdEquipa {get;set;}
public string Nome { get; set; }
public int Golos { get; set; }
}
public class Jogos
{
public DateTime Data { get; set; }
public string Descricao { get; set; }
public string Duracao { get; set; }
public JogosDetalhes EquipaCasa { get; set; }
public JogosDetalhes EquipaFora { get; set; }
}
public class JogosDetalhes
{
public int IdEquipa { get; set; }
public string NomeEquipa { get; set; }
public int GolosMarcados { get; set; }
public int GolosSofridos { get; set; }
public int CartoesAmarelos { get; set; }
public int CartoesVermelhos { get; set; }
public int FaltasCometidas { get; set; }
public int FaltasSofridas { get; set; }
}
public class Equipas
{
public int Id { get; set; }
public string Nome { get; set; }
public DateTime AnoFundado { get; set; }
}