SlideShare uma empresa Scribd logo
1 de 43
Schema Design 
Latinoware 2014 
Christiano Anderson 
anderson@propus.com.br 
Twitter: @dump 
Blog: http://christiano.me
Agenda 
● Apresentação 
● Modelo de documento MongoDB 
● Tipos de dados 
● Arquitetura 
● Boas práticas
Quem sou? 
● Especialista em Big Data e NoSQL na Propus; 
● Desenvolvedor Python; 
● Trabalha desde o início da internet comercial 
do Brasil; 
● Fundador do MUG-SP;
MongoDB 
● Orientação a documentos; 
● Índices simples e compostos; 
● Suporte a índices: 
– Full Text Search; 
– Geográfico;
Alguns conceitos 
● Base de dados; 
● Coleção; 
● Documento;
Alguns conceitos 
● Uma base de dados possui várias coleções; 
● Uma coleção possui vários documentos; 
– Comparando com banco de dados relacional, 
podemos dizer que: 
● Coleção = Tabela; 
● Documento = Registro;
Exemplo de documento 1 
{ 
"_id" : ObjectId("541f30d992a2ee25fedaa652"), 
"nome" : "Christiano", 
"twitter" : "dump" 
} 
Chave Valor
Exemplo de documento 2 
{ 
"_id" : ObjectId("541f30d992a2ee25fedaa652"), 
"nome" : "Christiano", 
"twitter" : "dump", 
"linguagens" : [ 
"Python", 
"C", 
"JavaScript", 
"C++" 
] 
} 
Uma lista ou array
Exemplo de documento 3 
{ 
"_id" : ObjectId("541f361892a2ee25fedaa653"), 
"nome" : "Christiano", 
"redes_sociais" : { 
"Twitter" : "dump", 
"Facebook" : "christiano.anderson", 
"LinkedIn" : "christiano.anderson", 
"Instagram" : "canderson9" 
} 
} 
Uma lista de valores ou 
Um documento embarcado
Desnormalização
Exemplo de dado 
Nome: Christiano Anderson 
Twitter: dump 
Cidade: São Paulo 
Estado: SP
Banco Relacional
select * from cadastro; 
Informação 
Normalizada, relaciona 
Com a tabela de cidade 
Que relaciona com a 
tabela de UF
E no MongoDB? 
{ 
"_id" : ObjectId("541f64d092a2ee25fedaa654"), 
"nome" : "Christiano", 
"twitter" : "dump", 
"cidade" : "São Paulo", 
"uf" : "SP" 
} 
Os dados são desnormalizados
E coleções de referência? 
Não há necessidade de criar uma coleção de 
referência para Estados e outra para Cidades
Pode ser inconsistente? 
● Sim, pode ocorrer inconsistências; 
● O controle deve ser feito via código;
Schema Design 
O grande segredo da modelagem 
Está no “schema design”
Schema Design 
● O arquiteto precisa entender como as 
informações serão inseridas e consultadas no 
sistema; 
● O sucesso está em extrair o maior número de 
informações em uma única consulta
Uma aplicação de Blog 
Você já viu a quantidade de tabelas existentes no 
WordPress?
Schema do Wordpress 
Fonte: http://codex.wordpress.org/Database_Description/3.3
Posts e Comentários 
Vamos pegar a parte principal 
de uma aplicação de blog: 
Posts 
Comentários
Posts e Comentários
Posts e comentários 
Exemplo clássico de 
“Um para muitos” 
Um post = Vários comentários
Pensando no Relacional 
● Tabela de Post possui a FK de cada post 
● Tabela de Comentário possui FK ligando a 
cada post 
● A cada acesso no Post, é necessário fazer uma 
consulta na tabela de Comentários para buscar 
todos
E no MongoDB?
No MongoDB 
Uma das técnicas é deixar posts 
e comentários na mesma coleção
{ 
"_id" : ObjectId("541f6a9092a2ee25fedaa655"), 
"titulo" : "Aqui é o título", 
"tags" : [ 
"teste", 
"exemplo", 
"mongodb" 
], 
"conteudo" : "Aqui vem o Lorem Ipsum básico", 
"comentarios" : [ 
{ 
"usuario" : "Usuario Troll", 
"email" : "troll@troland.com", 
"comentario" : "Vim aqui só trollar" 
}, 
{ 
"usuario" : "Usuario Sério", 
"email" : "serio@serioland.com", 
"comentario" : "Parabéns pelo post" 
} 
] 
} 
Post 
Os comentários ficam 
embarcados no 
mesmo documento 
que o post
Uma única query retorna o post 
E todos seus comentários
Outro exemplo de schema design: 
Coleção: livraria 
Coleção: alunos 
Os alunos podem retirar um ou 
mais livros da livraria. 
Como melhor fazer esse 
Controle com MongoDB?
Coleção de alunos 
> db.alunos.find() 
{ "_id" : 1, "nome" : "Pedrinho", "sala" : "200" } 
{ "_id" : 2, "nome" : "Zezinho", "sala" : "404" } 
{ "_id" : 3, "nome" : "Luizinho", "sala" : "500" }
Coleção de Livros 
> db.livros.find().pretty() 
{ "_id" : 1, "titulo" : "A Ilha Perdida", "autor" : "Maria José Dupré" } 
{ "_id" : 2, "titulo" : "Éramos Seis", "autor" : "Maria José Dupré" } 
{ "_id" : 3, "titulo" : "Sozinha no Mundo", "autor" : "Marcos Rey" }
Primeiro cenário 
Luizinho quer alugar o livro “A Ilha Perdida” 
Criar uma chave “aluguel” 
na coleção de livros
Alteração no documento do livro 
{ 
"_id" : 1, 
"titulo" : "A Ilha Perdida", 
"autor" : "Maria José Dupré", 
"aluguel" : { 
"aluno_id" : 3, 
"data" : ISODate("2014-09-21T00:00:00Z") 
} 
} 
Ligação com o id do 
aluno, Luizinho
Query de atualização 
db.livros.update({'_id': 1}, 
{$set:{'aluguel':{'aluno_id':3,'data':ISODate('2014-09- 
21')}}})
Ver todos os livros alugados 
> db.livros.find({'aluguel': 
{$exists:true}}).pretty() 
{'aluguel': 
"_id" : 1, 
"titulo" : "A Ilha Perdida", 
"autor" : "Maria José Dupré", 
"aluguel" : { 
"aluno_id" : 3, 
"data" : ISODate("2014-09- 
21T00:00:00Z") 
} 
}
Série temporal 
timestamp memoria_usada 
2013-10-10T23:06:37.000Z 1000000 
2013-10-10T23:06:38.000Z 2000000 
2013-10-10T23:06:39.000Z 2332200
A principal pergunta: 
Como você vai buscar esses dados? 
Vai agregar por horas?
Documentos únicos 
{ 
timestamp: ISODate("2013-10-10T23:06:37.000Z"), 
type: ”memory_used”, 
value: 1000000 
}, 
{ 
timestamp: ISODate("2013-10-10T23:06:38.000Z"), 
type: ”memory_used”, 
value: 2000000 
}, 
{ 
timestamp: ISODate("2013-10-10T23:06:39.000Z"), 
type: ”memory_used”, 
value: 2322000 
}
Agregado por minuto 
{ 
timestamp_minute: ISODate("2013-10- 
10T23:06:00.000Z"), 
type: “memory_used”, 
values: { 
0: 999999, 
… 
37: 1000000, 
38: 1500000, 
… 
59: 2000000 
} 
}
Agregado por hora 
{ 
timestamp_hour: ISODate("2013-10- 
10T23:00:00.000Z"), 
type: “memory_used”, 
values: { 
0: 999999, 
1: 1000000, 
…, 
3598: 1500000, 
3599: 2000000 
} 
}
Melhor schema 
A pergunta é a mesma: buscar o maior número 
de informações com uma ou poucas queries
Melhor schema 
● Eficiência na gravação 
● Eficiência na leitura 
● Não existe mágica, é necessário entender o 
funcionamento da aplicação 
● Bom schema, bom código = sucesso garantido 
● Índices e agregadores podem ser necessários.
Obrigado! 
Christiano Anderson 
Twitter: dump

Mais conteúdo relacionado

Mais procurados

MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberChristiano Anderson
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBElaine Naomi
 
MongoDB: Uma forma diferente de pensar no desenvolvimento
MongoDB: Uma forma diferente de pensar no desenvolvimento MongoDB: Uma forma diferente de pensar no desenvolvimento
MongoDB: Uma forma diferente de pensar no desenvolvimento Marcos Thomaz
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDBLelyBarros
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014Fernando Boaglio
 
Elasticsearch como gerenciar seus logs com logstash e kibana
Elasticsearch   como gerenciar seus logs com logstash e kibanaElasticsearch   como gerenciar seus logs com logstash e kibana
Elasticsearch como gerenciar seus logs com logstash e kibanaLuiz Henrique Zambom Santana
 
Como o elasticsearch salvou minhas buscas
Como o elasticsearch salvou minhas buscasComo o elasticsearch salvou minhas buscas
Como o elasticsearch salvou minhas buscasWaldemar Neto
 
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...ISCTE-IUL ACM Student Chapter
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoRicardo Longa
 

Mais procurados (15)

MongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e ConhecendoMongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e Conhecendo
 
MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saber
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
MongoDB: Uma forma diferente de pensar no desenvolvimento
MongoDB: Uma forma diferente de pensar no desenvolvimento MongoDB: Uma forma diferente de pensar no desenvolvimento
MongoDB: Uma forma diferente de pensar no desenvolvimento
 
#5 CRUD no MongoDB
#5   CRUD  no MongoDB#5   CRUD  no MongoDB
#5 CRUD no MongoDB
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
 
#1 Introdução ao MongoDB
#1   Introdução ao MongoDB#1   Introdução ao MongoDB
#1 Introdução ao MongoDB
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
NoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETECNoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETEC
 
#3 Instalação MongoDB
#3   Instalação MongoDB  #3   Instalação MongoDB
#3 Instalação MongoDB
 
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
 
Elasticsearch como gerenciar seus logs com logstash e kibana
Elasticsearch   como gerenciar seus logs com logstash e kibanaElasticsearch   como gerenciar seus logs com logstash e kibana
Elasticsearch como gerenciar seus logs com logstash e kibana
 
Como o elasticsearch salvou minhas buscas
Como o elasticsearch salvou minhas buscasComo o elasticsearch salvou minhas buscas
Como o elasticsearch salvou minhas buscas
 
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenho
 

Semelhante a MongoDB Schema Design em

MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoJulio Monteiro
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBiMasters
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPLuiz Henrique Zambom Santana
 
GraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisGraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisBruno Lemos
 
NOSQL uma breve introdução
NOSQL uma breve introduçãoNOSQL uma breve introdução
NOSQL uma breve introduçãoWise Systems
 
Mude seu jeito de pensar com MongoDB
Mude seu jeito de pensar com MongoDBMude seu jeito de pensar com MongoDB
Mude seu jeito de pensar com MongoDBDouglas Lira
 
Modelando aplicação em documento - MongoDB
Modelando aplicação em documento - MongoDBModelando aplicação em documento - MongoDB
Modelando aplicação em documento - MongoDBThiago Avelino
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsNelson Glauber Leal
 
NOSQL_Uma_breve_introducao.pptx
NOSQL_Uma_breve_introducao.pptxNOSQL_Uma_breve_introducao.pptx
NOSQL_Uma_breve_introducao.pptxEizoKato
 
Mongo DB
Mongo DBMongo DB
Mongo DBdist_bp
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesChristiano Anderson
 

Semelhante a MongoDB Schema Design em (20)

MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Minicurso mongo db
Minicurso mongo dbMinicurso mongo db
Minicurso mongo db
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHP
 
GraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisGraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveis
 
Mongo db slides
Mongo db slidesMongo db slides
Mongo db slides
 
Palestra nosql
Palestra nosqlPalestra nosql
Palestra nosql
 
NOSQL uma breve introdução
NOSQL uma breve introduçãoNOSQL uma breve introdução
NOSQL uma breve introdução
 
Mude seu jeito de pensar com MongoDB
Mude seu jeito de pensar com MongoDBMude seu jeito de pensar com MongoDB
Mude seu jeito de pensar com MongoDB
 
Modelando aplicação em documento - MongoDB
Modelando aplicação em documento - MongoDBModelando aplicação em documento - MongoDB
Modelando aplicação em documento - MongoDB
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
NOSQL_Uma_breve_introducao.pptx
NOSQL_Uma_breve_introducao.pptxNOSQL_Uma_breve_introducao.pptx
NOSQL_Uma_breve_introducao.pptx
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
Python MongoDB no MongoSP
Python MongoDB no MongoSPPython MongoDB no MongoSP
Python MongoDB no MongoSP
 

Mais de Christiano Anderson

Mapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoMapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoChristiano Anderson
 
Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014Christiano Anderson
 
Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Christiano Anderson
 
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERIGeo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERIChristiano Anderson
 

Mais de Christiano Anderson (11)

certificadoTDC2016Floripa
certificadoTDC2016FloripacertificadoTDC2016Floripa
certificadoTDC2016Floripa
 
Mapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoMapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjango
 
Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014
 
Big Data Latinoware 2014
Big Data Latinoware 2014Big Data Latinoware 2014
Big Data Latinoware 2014
 
Big Data - Conceitos Básicos
Big Data - Conceitos BásicosBig Data - Conceitos Básicos
Big Data - Conceitos Básicos
 
Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15
 
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERIGeo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 
GeoDjango
GeoDjangoGeoDjango
GeoDjango
 
Scrum
ScrumScrum
Scrum
 
Python and MongoDB
Python and MongoDBPython and MongoDB
Python and MongoDB
 

MongoDB Schema Design em

  • 1. Schema Design Latinoware 2014 Christiano Anderson anderson@propus.com.br Twitter: @dump Blog: http://christiano.me
  • 2. Agenda ● Apresentação ● Modelo de documento MongoDB ● Tipos de dados ● Arquitetura ● Boas práticas
  • 3. Quem sou? ● Especialista em Big Data e NoSQL na Propus; ● Desenvolvedor Python; ● Trabalha desde o início da internet comercial do Brasil; ● Fundador do MUG-SP;
  • 4. MongoDB ● Orientação a documentos; ● Índices simples e compostos; ● Suporte a índices: – Full Text Search; – Geográfico;
  • 5. Alguns conceitos ● Base de dados; ● Coleção; ● Documento;
  • 6. Alguns conceitos ● Uma base de dados possui várias coleções; ● Uma coleção possui vários documentos; – Comparando com banco de dados relacional, podemos dizer que: ● Coleção = Tabela; ● Documento = Registro;
  • 7. Exemplo de documento 1 { "_id" : ObjectId("541f30d992a2ee25fedaa652"), "nome" : "Christiano", "twitter" : "dump" } Chave Valor
  • 8. Exemplo de documento 2 { "_id" : ObjectId("541f30d992a2ee25fedaa652"), "nome" : "Christiano", "twitter" : "dump", "linguagens" : [ "Python", "C", "JavaScript", "C++" ] } Uma lista ou array
  • 9. Exemplo de documento 3 { "_id" : ObjectId("541f361892a2ee25fedaa653"), "nome" : "Christiano", "redes_sociais" : { "Twitter" : "dump", "Facebook" : "christiano.anderson", "LinkedIn" : "christiano.anderson", "Instagram" : "canderson9" } } Uma lista de valores ou Um documento embarcado
  • 11. Exemplo de dado Nome: Christiano Anderson Twitter: dump Cidade: São Paulo Estado: SP
  • 13. select * from cadastro; Informação Normalizada, relaciona Com a tabela de cidade Que relaciona com a tabela de UF
  • 14. E no MongoDB? { "_id" : ObjectId("541f64d092a2ee25fedaa654"), "nome" : "Christiano", "twitter" : "dump", "cidade" : "São Paulo", "uf" : "SP" } Os dados são desnormalizados
  • 15. E coleções de referência? Não há necessidade de criar uma coleção de referência para Estados e outra para Cidades
  • 16. Pode ser inconsistente? ● Sim, pode ocorrer inconsistências; ● O controle deve ser feito via código;
  • 17. Schema Design O grande segredo da modelagem Está no “schema design”
  • 18. Schema Design ● O arquiteto precisa entender como as informações serão inseridas e consultadas no sistema; ● O sucesso está em extrair o maior número de informações em uma única consulta
  • 19. Uma aplicação de Blog Você já viu a quantidade de tabelas existentes no WordPress?
  • 20. Schema do Wordpress Fonte: http://codex.wordpress.org/Database_Description/3.3
  • 21. Posts e Comentários Vamos pegar a parte principal de uma aplicação de blog: Posts Comentários
  • 23. Posts e comentários Exemplo clássico de “Um para muitos” Um post = Vários comentários
  • 24. Pensando no Relacional ● Tabela de Post possui a FK de cada post ● Tabela de Comentário possui FK ligando a cada post ● A cada acesso no Post, é necessário fazer uma consulta na tabela de Comentários para buscar todos
  • 26. No MongoDB Uma das técnicas é deixar posts e comentários na mesma coleção
  • 27. { "_id" : ObjectId("541f6a9092a2ee25fedaa655"), "titulo" : "Aqui é o título", "tags" : [ "teste", "exemplo", "mongodb" ], "conteudo" : "Aqui vem o Lorem Ipsum básico", "comentarios" : [ { "usuario" : "Usuario Troll", "email" : "troll@troland.com", "comentario" : "Vim aqui só trollar" }, { "usuario" : "Usuario Sério", "email" : "serio@serioland.com", "comentario" : "Parabéns pelo post" } ] } Post Os comentários ficam embarcados no mesmo documento que o post
  • 28. Uma única query retorna o post E todos seus comentários
  • 29. Outro exemplo de schema design: Coleção: livraria Coleção: alunos Os alunos podem retirar um ou mais livros da livraria. Como melhor fazer esse Controle com MongoDB?
  • 30. Coleção de alunos > db.alunos.find() { "_id" : 1, "nome" : "Pedrinho", "sala" : "200" } { "_id" : 2, "nome" : "Zezinho", "sala" : "404" } { "_id" : 3, "nome" : "Luizinho", "sala" : "500" }
  • 31. Coleção de Livros > db.livros.find().pretty() { "_id" : 1, "titulo" : "A Ilha Perdida", "autor" : "Maria José Dupré" } { "_id" : 2, "titulo" : "Éramos Seis", "autor" : "Maria José Dupré" } { "_id" : 3, "titulo" : "Sozinha no Mundo", "autor" : "Marcos Rey" }
  • 32. Primeiro cenário Luizinho quer alugar o livro “A Ilha Perdida” Criar uma chave “aluguel” na coleção de livros
  • 33. Alteração no documento do livro { "_id" : 1, "titulo" : "A Ilha Perdida", "autor" : "Maria José Dupré", "aluguel" : { "aluno_id" : 3, "data" : ISODate("2014-09-21T00:00:00Z") } } Ligação com o id do aluno, Luizinho
  • 34. Query de atualização db.livros.update({'_id': 1}, {$set:{'aluguel':{'aluno_id':3,'data':ISODate('2014-09- 21')}}})
  • 35. Ver todos os livros alugados > db.livros.find({'aluguel': {$exists:true}}).pretty() {'aluguel': "_id" : 1, "titulo" : "A Ilha Perdida", "autor" : "Maria José Dupré", "aluguel" : { "aluno_id" : 3, "data" : ISODate("2014-09- 21T00:00:00Z") } }
  • 36. Série temporal timestamp memoria_usada 2013-10-10T23:06:37.000Z 1000000 2013-10-10T23:06:38.000Z 2000000 2013-10-10T23:06:39.000Z 2332200
  • 37. A principal pergunta: Como você vai buscar esses dados? Vai agregar por horas?
  • 38. Documentos únicos { timestamp: ISODate("2013-10-10T23:06:37.000Z"), type: ”memory_used”, value: 1000000 }, { timestamp: ISODate("2013-10-10T23:06:38.000Z"), type: ”memory_used”, value: 2000000 }, { timestamp: ISODate("2013-10-10T23:06:39.000Z"), type: ”memory_used”, value: 2322000 }
  • 39. Agregado por minuto { timestamp_minute: ISODate("2013-10- 10T23:06:00.000Z"), type: “memory_used”, values: { 0: 999999, … 37: 1000000, 38: 1500000, … 59: 2000000 } }
  • 40. Agregado por hora { timestamp_hour: ISODate("2013-10- 10T23:00:00.000Z"), type: “memory_used”, values: { 0: 999999, 1: 1000000, …, 3598: 1500000, 3599: 2000000 } }
  • 41. Melhor schema A pergunta é a mesma: buscar o maior número de informações com uma ou poucas queries
  • 42. Melhor schema ● Eficiência na gravação ● Eficiência na leitura ● Não existe mágica, é necessário entender o funcionamento da aplicação ● Bom schema, bom código = sucesso garantido ● Índices e agregadores podem ser necessários.