1. e NoSQL Tudo o que voc precisa saber Frum Internacional de
Software Livre 2015 Christiano Anderson [email protected]
http://www.propus.com.br Twitter: @dump
2. Quem sou? Arquiteto de dados na Propus Science; Trabalho com
web e software livre desde 1995; Python desde 2000; MongoDB desde o
incio do projeto; Colaboro e j colaborei com projetos como: GNU
Project (Free Software Foundation); Debian Project; Python; MongoDB
MUG - SP; Twitter: @dump Blog: http://christiano.me Facebook,
LinkedIn: Christiano Anderson
3. Mongo? Sim, em muitos idiomas pode ser um termo pejorativo,
mas a origem vem de: Humongous Gigantesco
4. Histria Foi criado pelos fundadores da Doubleclick; 10gen
foi fundada em 2007; A ideia inicial era fazer um produto
semelhante ao Google App Engine;
5. Alta curva de crescimento Contribuies ao core do
MongoDB
6. Grandes players utilizando Foursquare; Github; EA Games;
Entre diversos outros No Brasil: EasyTaxi; Globo.com; IG; Mercado
Livre ZAP Imveis Ingresse.com Terra Networks
7. Um pouco de conceitos... NoSQL: O termo foi criado por Carlo
Strozzi e Eric Evans como referncia a um tipo de armazenamento de
dados; Nunca, mas nunca est relacionado a dio ao modelo SQL, pelo
contrrio, podem at trabalhar em conjunto; O termo NoREL e No
Relacional tambm bastante utilizado
8. Por que usar NoSQL? Novos paradigmas (nem to novos assim);
Funcionalidades; Escalabilidade; Performance; No ficar preso a
modelagem;
9. Volume de dados Grande volume relativo, o que voc considera
grande? Dados que crescem exponencialmente; Agregam muitos valores
dinamicamente; No precisam de modelagem;
10. Considere uso de MongoDB se... Est usando muito cache em
sua aplicao; Os dados mudam muito; Os dados esto crescendo de forma
exponencial; Precisa de processamento em tempo real; Gosta de
desenvolvimento gil; Sua aplicao beta perptua; Tem dificuldade para
trabalhar com modelo relacional; Usa muito join na sua aplicao
relacional;
11. Iniciando com MongoDB Sua distribuio GNU/Linux deve possuir
pacotes prontos; No site da MongoDB, possvel baixar binrios para
outros sistemas operacionais; A instalao bem simples, a configurao
padro do MongoDB j atende quase todos os cenrios;
12. Pode substituir o banco relacional? At pode, mas uma questo
de arquitetura e escolhas; Uma aplicao pode usar MongoDB e banco
relacional; Tudo vai depender da sua arquitetura;
13. No existe a melhor ferramenta... Existe a que atende melhor
a sua necessidade. A necessidade pode exigir mais de uma
ferramenta.
14. Suporte a linguagens de programao Praticamente todas as
linguagens de programao possuem suporte (driver) para MongoDB;
Suporte oficial s principais linguagens (Python, C, C++, PHP, Java,
NodeJS, Perl, Scala, Ruby, C#); Suporte da comunidade a diversas
outras linguagens (R, Go, Erlang, LISP, Lua, Matlab, Smalltalk,
entre outras)
16. Busca textual Possui suporte a portugus do Brasil;
Stemming; Stopwords;
17. Stemming Se a frase abaixo estiver indexada como FTS:
Enquanto houver vontade de lutar, haver esperana de vencer Se
houver uma busca pela palavra vencendo, a mesma ser exibida no
resultado de busca.
18. Interface em JavaScript O MongoShell baseado em JavaScript,
oferece toda flexibilidade para gerenciar o banco de dados e
executar operaes administrativas
19. Nomenclaturas Banco Relacional MongoDB Base de dados -->
Base de Dados Tabela --> Coleo Registro --> Documento ndice
--> ndice Join --> Documento embarcado Foreign key -->
Referncia
21. Realizando operaes via MongoShell O MongoDB implcito, no
existe necessidade de criar toda estrutura do banco de dados antes;
O MongoShell uma tima forma de aprendizado!
22. MongoShell anderson@endor:~$ mongo MongoDB shell version:
2.4.6 connecting to: test > a = 10 10 > b = 30 30 > a <
b true > b < a false
23. Vamos l... anderson@endor:~$ mongo MongoDB shell version:
2.4.6 connecting to: test > use escola switched to db escola
> Nesse ponto, o banco ainda est vazio.
24. Inserindo um registro anderson@endor:~$ mongo MongoDB shell
version: 2.4.6 connecting to: test > use escola switched to db
escola > db.alunos.insert({ ... 'nome':'Rolando Rocha', ...
'turma':'Python', ... 'nota': 10}) > Nesse ponto, o banco foi
criado e o documento foi inserido, j est persistido em disco
25. Verificando o registro > db.alunos.findOne() { "_id" :
ObjectId("525ecd6585512f4130afd2c4") , "nome" : "Rolando Rocha",
"turma" : "Python", "nota" : 10 } ObjectId nico para cada
documento
39. Comparativo SQL SQL MongoDB INSERT INTO USERS VALUES(1,1)
db.users.insert({a:1, b:1}) SELECT a,b FROM users db.users.find({},
{a: 1, b: 1}) SELECT * FROM users db.users.find() SELECT * FROM
users WHERE age=33 db.users.find({age: 33}) SELECT * FROm users
WHERE name = pedro db.users.find({name:pedro})
40. Comparativo SQL SQL MongoDB SELECT * FROM users WHERE
age=33 ORDER BY name db.users.find({age:33}).sort({na me:1}) SELECT
* FROM users WHERE age < 33 db.users.find({age:{$lt:33}})})
CREATE INDEX myindexname ON user(name)
db.users.ensureIndex({name:1}) SELECT * FROM users WHERE a = 1 AND
b = q db.users.find({a:1, b:q}) SELECT * FROM users LIMIT 10 SKIP
20 db.users.find().limit(10).skip(20)
41. Como descobrir documentos que no possuem determinada chave
> db.alunos.find({'email': {$exists: false} })
42. Adicionando chave em todos os documentos >
db.alunos.update({ }, { $set: { 'aprovado': true } }, { multi: true
}) O que adicionar Query Grava a alterao em todos Os registros que
atendem Ao critrio
45. Explicao primeiro cenrio Adicionado coleo de ALUNOS uma
chave chamada biblioteca_id; Facilita a pesquisa de quais alunos
alugaram livros (dentro da coleo alunos); Dificulta a pesquisa de
quais livros foram alugados (dentro da coleo da biblioteca);
47. Explicao segundo cenrio Adicionada uma chave aluguel dentro
da coleo biblioteca; Todos livros alugados possuem o atributo
aluguel; Facilita a busca dos livros disponveis e alugados; Pode
criar histrico de alugueis; Mas dificulta a busca de quais alunos
esto alugando livro (viso: coleo de alunos); Esse seria um cenrio
recomendado!
48. Terceiro cenrio Criar uma collection de referncia, exemplo:
aluguel_livros e relacionar o _id do aluno com _id do livro, assim
como qualquer outra informao adicional NO USE ESSE MODELO! MUITO
RELACIONAL!
49. Aplicao de blog no MongoDB, casamento perfeito!!!
50. { "_id" : ObjectId("541f6a9092a2ee25fedaa655"), "titulo" :
"Aqui o ttulo", "tags" : [ "teste", "exemplo", "mongodb" ],
"conteudo" : "Aqui vem o Lorem Ipsum bsico", "comentarios" : [ {
"usuario" : "Usuario Troll", "email" : "[email protected]",
"comentario" : "Vim aqui s trollar" }, { "usuario" : "Usuario
Srio", "email" : "[email protected]", "comentario" : "Parabns
pelo post" } ] } Exemplo Aplicao Blog Os comentrios ficam
embarcados no mesmo documento que o post
51. Guardar logs, sries temporais e muitos documentos pequenos,
tambm tem uma modelagem especfica para isso. Pense nas
possibilidades de uso desses dados antes de gravar qualquer coisa!
Faa testes, muitos testes
55. Documentos nicos Um dia possui 86.400 segundos; 86.400
documentos por dia na coleo; Se quiser pegar o histrico de um dia,
ter de varrer 86.400 documentos; Se quiser pegar o histrico de um
ano, sero 31.556.926 documentos consultados!!! Isso para o MongoDB
pouco, mas pode ser otimizado...
56. Agregado por minuto { timestamp_minute: ISODate("2013-10-
10T23:06:00.000Z"), type: memory_used, values: { 0: 999999, 37:
1000000, 38: 1500000, 59: 2000000 } } 23:06 Todos os segundos das
23:06
57. Documentos agregados por minuto Um dia possui 1.440
minutos; 1.440 documentos por dia na coleo; Se quiser pegar o
histrico de um dia, ter de varrer 1.440 documentos; Se quiser pegar
o histrico de um ano, sero 525.600 documentos consultados!!! Ainda
pode ser mais otimizado...
58. Agregado por hora { timestamp_hour: ISODate("2013-10-
10T23:00:00.000Z"), type: memory_used, values: { 0: 999999, 1:
1000000, , 3598: 1500000, 3599: 2000000 } } Cada segundo dessa hora
e seus respectivos valores 1h = 3.600 segundos 23h
59. Documentos agregados por hora Um dia possui 24 horas; 24
documentos por dia na coleo; Se quiser pegar o histrico de um dia,
ter de varrer apenas 24 documentos; Se quiser pegar o histrico de
um ano, sero apenas 365 documentos consultados!!! Chegamos em um
nvel interessante de granularidade de dados...
60. Melhor schema A pergunta de ouro: Como buscar o maior nmero
de informaes com menor nmero de queries (de preferncia, uma)?
61. Melhor schema Eficincia na gravao Eficincia na leitura No
existe mgica, necessrio entender o funcionamento da aplicao Bom
schema, bom cdigo = sucesso garantido ndices e agregadores podem
ser necessrios. Pesquise mais sobre Schema Design MongoDB;
62. Concluso um novo paradigma, evite pensar de forma
relacional, seno o projeto ficar engessado; Pode parecer estranho
no comeo, mas a prtica mostra que esse modelo funciona muito bem e
muito produtivo;
63. Perguntas??? Obrigado!!! Se no deu tempo de responder sua
pergunta, me chame nas redes sociais ou pelos corredores do FISL!
:-) http://christiano.me Twitter: @dump Email: [email protected]
Facebook, LinkedIn: Christiano Anderson