NoSQL e MongoDB
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

NoSQL e MongoDB

on

  • 2,704 views

Palestra ministrada na Fundação Educacional de Fernandópolis em 22/02/2011 sobre banco de dados não relacionais, NoSQL e MongoDB.

Palestra ministrada na Fundação Educacional de Fernandópolis em 22/02/2011 sobre banco de dados não relacionais, NoSQL e MongoDB.

Statistics

Views

Total Views
2,704
Views on SlideShare
2,691
Embed Views
13

Actions

Likes
7
Downloads
119
Comments
2

6 Embeds 13

http://localhost:4000 7
https://www.linkedin.com 2
http://paper.li 1
http://beta.shamani.me 1
http://shamani.me 1
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Ultimo: Lista todos clientes em formato JSON.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

NoSQL e MongoDB Presentation Transcript

  • 1. Você tem dadoem casa?
  • 2. SQL
  • 3. SQL Structured Query LanguageSELECT * FROM * WHERE 1 = 1;
  • 4. SQLApache Derby PostgreSQLCaché InterBaseDB2 Microsoft AccessFirebird Microsoft SQL ServerHSQLDB MySQLSQLite Oracle
  • 5. NoSQLJefferson Q. Venerando
  • 6. NoSQL?
  • 7. NoSQL•Usado em 1998 como o nome de um BDrelacional open source sem interface SQL;•“Completamente distinto do modelorelacional”;•Deveria ser chamado NoREL;•Voltou a ser usado em 2009 em um eventosobre banco de dados open sourcedistribuídos.
  • 8. NoSQL•Vieram para suprir necessidades dos BDtradicionais;•Alta performance, escalabilidade, replicação,suporte à dados estruturados e sub colunas.
  • 9. Escalability?•Escalabilidade vertical (scale up) •Aumentar poder do servidor.•Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.
  • 10. NoSQL•Informações necessárias agrupadas nomesmo registro;•Sem relacionamentos =)
  • 11. NoSQL•Existem vários tipos;•São divididos pela forma usada para trabalharcom seus dados: •Wide column store •Key/value store •Graph store •Column oriented store •Document store
  • 12. NoSQL Wide column store•Fortemente inspirados pelo BigTable dogoogle, suportam várias linhas e colunas alémde subcolunas.•Outros exemplos: •HBase(Apache) •HiperTable •Cassandra(Apache)
  • 13. NoSQL Key/value store•Mais simples, chave e valor para a chave.•Agüenta mais carga de dados.•São os mais escaláveis.•Exemplos: •MemcacheDB •SimpleBD •Berkeley DB
  • 14. NoSQL Graph store•Mais complexo.•Guarda objeto e não registros.•Buscas são feitas pela navegação destesobjetos.•Exemplos: •Neo4J •InfoGrid •BigData
  • 15. NoSQL Column oriented store•São relacionais.•Tem características do NoSQL.•Dados armazenados em colunas, não emlinhas.•Exemplos: •Vertica •MonetDB •LucidDB
  • 16. NoSQL Document oriented store•Baseados em documentos XML ou JSON.•Localização por ID único ou qualquer registrodo documento.•Exemplos: •CouchDB(Apache) •MongoDB •Riak
  • 17. Wood in the cat
  • 18. Manga?
  • 19. MongoDB Orientado a Documentos•Modelo relacional: representa mundo real (queé n-dimensional) usando abordagembidimensional.•Podemos melhorar isso com análise, masposteriormente um outro atributo pode serencontrado.
  • 20. MongoDB•O equivalente a registros são documentos.•Sintaxe JSON.
  • 21. JASON?
  • 22. JSON - JavaScript Object NotationJefferson = { nome:"Jefferson Queiroz Venerando", apelido:"Shaman", cidade:"Iturama"}
  • 23. Jefferson = { nome:"Jefferson Queiroz Venerando", apelido:"Shaman", cidade:"Iturama"}db.testedb.save(Jefferson)
  • 24. Boer = { nome:"Marcelo Tadeu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF"}db.testedb.save(Boer)
  • 25. Eae?•Representamos objetos do mundo real daforma como eles são: complexos e únicos. =)•Se precisar de novos atributos, eles serãocriados apenas onde for necessário. =)•Desenvolvedor precisa tomar cuidado probanco não virar a casa da mãe Joana. =(
  • 26. Redundância de dados over 9000•Modelo relacional: Reduzir o máximo possívela redundância de dados(formas normais,relacionamentos).•MongoDB: Sem relacionamentos, duplicaçãonão é um problema.
  • 27. RedunZzzZZzZz...pessoa1 = {nome:"João", cidade:{nome:"Belo Horizonte",estado:"MG"}}pessoa2 = {nome:"Zequinha", cidade:{nome:"Belo Horizonte",estado: "MG"}}pessoa3 = {nome:"Joca", cidade:"Lagoa Santa"}pessoa4 = {nome:"Jurema", cidade:{nome:"Rio de Janeiro",estado:{nome:"Rio de Janeiro", pais:{nome:"Brasil"}}}
  • 28. Redundância de dados over 9000•Não há tabelas: há coleções de documentos.•O documento é meu e eu guardo o que euquiser nele.•Documentos devem ser auto-contidos.•Uma única consulta retorna o documentointeiro.
  • 29. Então?•Mais performance. Uma consulta retorna tudoo que precisa a respeito do documento. =)•Alterar todos registros relacionados a umaunidade semântica requer tratamento um a um.
  • 30. Na prática...
  • 31. Database == Database
  • 32. > show dbs admin bsp_development local> use bsp_development switched to db bsp_development> show collections clientes fornecedores funcionarios servicos system.indexes
  • 33. Coleção == Tabela
  • 34. > db.clientesbsp_development.clientes> db.clientes.count()5> db.clientes.find().forEach(function(doc) { print(tojson(doc));});
  • 35. Documento == Linha
  • 36. { "_id" : ObjectId("4cee87ac271cd3146e00002a"), "ativo" : true, "nome" : "Ryu", "email" : "ryuhadouken@shamanime.com", "poder_especial" : "hadouken", "created_at" : "Thu Nov 25 2010 13:58:36 GMT-0200(BRST)", "updated_at" : "Thu Nov 25 2010 13:58:36 GMT-0200(BRST)",}
  • 37. Funcionalidades similares Consultas dinâmicas
  • 38. > use testeswitched to db teste> db.cores.insert({nome:vermelho, primaria:true})> db.cores.insert({nome:verde, primaria:true})> db.cores.insert({nome:azul, primaria:true})> db.cores.insert({nome:rosa, primaria:false})> db.cores.insert({nome:amarelo, primaria:false})> db.cores.insert({nome:laranja, primaria:false})
  • 39. > var cursor = db.cores.find()> cursor.next(){ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true}
  • 40. > cursor{ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }{ "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul", "primaria" : true }{ "_id" : ObjectId("4d56e8f6e0ab4d700255d82c"), "nome" : "rosa", "primaria" : false }{ "_id" : ObjectId("4d56e8fce0ab4d700255d82d"), "nome" : "amarelo", "primaria" : false }{ "_id" : ObjectId("4d56e903e0ab4d700255d82e"), "nome" : "laranja", "primaria" : false }
  • 41. SELECT * FROM cores WHERE nome = verde;> db.cores.find({nome:verde}){ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
  • 42. SELECT nome FROM cores WHERE primaria = 1;> db.cores.find({primaria:true}, {nome:true}){ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho" }{ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde" }{ "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul" }
  • 43. > db.cores.find({nome:/l/}){ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true }{ "_id" : ObjectId("4d56e8ede0ab4d700255d82b"), "nome" : "azul", "primaria" : true }{ "_id" : ObjectId("4d56e8fce0ab4d700255d82d"), "nome" : "amarelo", "primaria" : false }{ "_id" : ObjectId("4d56e903e0ab4d700255d82e"), "nome" : "laranja", "primaria" : false }
  • 44. > db.pessoas.insert({nome:"Boer", idade:28})> db.pessoas.insert({nome:"Tiago", idade:24})> db.pessoas.insert({nome:"Guilherme", idade:39})
  • 45. SELECT * FROM pessoas WHERE idade > 24> db.pessoas.find({idade: {$gt: 24}}){ "_id" : ObjectId("4d594916e0ab4d700255d82f"), "nome" : "Boer", "idade" : 28 }{ "_id" : ObjectId("4d59492ae0ab4d700255d831"), "nome" : "Guilherme", "idade" : 39 }
  • 46. SELECT * FROM pessoas WHERE idade <= 24> db.pessoas.find({idade: {$lte: 24}}){ "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
  • 47. $bot_add $bot_kick$bot_add_ct $bot_kick x$bot_add_tr $bot_knives only$bot_kill $bot_pistols_only$bot_difficulty 0 $bot_snipers_only$bot_difficulty 2 $bot_all_weapons$bot_difficulty 3 $bot_allow_shield x$bot_difficulty 4
  • 48. $gt $all$gte $size$lt $exists$lte $type$ne $elemMatch$in $not$nin $where$mod
  • 49. Funcionalidades similares Agregação
  • 50. > db.cores.count()6> db.cores.count({primaria:true})3
  • 51. > db.cores.distinct(nome)[ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ]> db.pessoas.distinct(nome, {idade:24})[ "Tiago" ]
  • 52. > db.itens.insert({titulo:Home, template:home})> db.itens.insert({titulo:O que fazemos, template:pagina})> db.itens.insert({titulo:Quem somos, template:pagina})> db.itens.insert({titulo:Trabalhe conosco, template:pagina})> db.itens.insert({titulo:Nossos valores, template:pagina})> var key = {template: true};> var inicial = {count:0};> var reduce = function(obj, prev) {prev.count += 1;};> db.itens.group({key:key, initial:inicial, reduce:reduce})[ {"template" : "home", "count" : 1}, {"template" : "pagina", "count" : 4}]
  • 53. > db.itens.insert({tags: [cachorro, gato]})> db.itens.insert({tags: [cachorro]})> db.itens.insert({tags: [cachorro, rato]})> db.itens.insert({tags: [cachorro, rato, macaco]})> db.itens.insert({tags: [cachorro, rato, macaco]})> db.itens.insert({tags: [cachorro, macaco]})
  • 54. GROUP BY = MapReduce> var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); }
  • 55. GROUP BY = MapReduce> var reduce = function(key, values) { var count = 0; for(var i=0, len=values.lenght; i<len; i++) { count += values[i].count; } return {count: count}; }
  • 56. GROUP BY = MapReduce> var result = db.itens.mapReduce(map, reduce);> result{ "ok" : 1, "timeMillis" : 86, "result" : "tmp.mr.mapreduce_1273861517_683", "counts" : { "input" : 6, "emit" : 13, "output" : 4 }}
  • 57. GROUP BY = MapReduce> db[result.result].find(){ "_id" : "cachorro", "value" : { "count" : 6 } }{ "_id" : "gato", "value" : { "count" : 1 } }{ "_id" : "macaco", "value" : { "count" : 3 } }{ "_id" : "rato", "value" : { "count" : 3 } }
  • 58. Funcionalidades similares Relacionamentos
  • 59. Relacionamentos Um para Muitos
  • 60. 1. Normalizado
  • 61. // inserir post> db.posts.insert({titulo:Analise e Projeto de Sistemas});> var post = db.posts.findOne({titulo:Analise e Projeto deSistemas});// inserir comentario> db.comentarios.insert({ nome:Jefferson, corpo:Awo Boer, eu nao tenho mais APS!, post_id : post._id});> var comentario = db.comentarios.findOne({nome:Jefferson});
  • 62. SELECT * FROM comentarios WHERE post_id = {#post.id}> db.comentarios.find({post_id: post._id}){ "_id" : ObjectId("4d5955f1e0ab4d700255d83e"), "nome" : "Jefferson", "corpo" : "Awo Boer, eu nao tenho mais APS!", "post_id" : ObjectId("4d5955a5e0ab4d700255d83d")}
  • 63. SELECT * FROM posts WHERE id = {#comentario.id}> db.posts.find({_id: comentario.post_id}){ "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas"}
  • 64. 2. Embedded
  • 65. // inserir post E comentarios> db.posts.insert({ titulo: Analise e Projeto de Sistemas, comentarios: [ nome: Jefferson, corpo: Haha, passei!}, nome: Diego, corpo: Da meio ponto ai, Boer!} ]})
  • 66. > var post = db.posts.find({titulo:Analise e Projeto de Sistemas});> post{ "_id" : ObjectId("4d5957e7e0ab4d700255d83f"), "titulo" : "Analise e Projeto de Sistemas", "comentarios" : [ {"nome" : "Jefferson", "corpo" : "Haha, passei!"}, {"nome" : "Diego","corpo" : "Da meio ponto ai,Boer!"} ]}
  • 67. > db.posts.find({comentarios.nome:Diego})> db.posts.find({ comentarios: { $elemMatch: {nome:Diego} }})
  • 68. // inserir posts, comentários e respostas> db.posts.insert({ titulo:APS, comentarios: [ { nome:Jefferson, corpo:Awo Boer, nao tenho mais APS!, comentarios: [ {nome:Diego, corpo:Vou ficar de exame :(}, {nome:Boer, corpo:Seus safadões!} ] } ]})
  • 69. > db.posts.insert({ titulo: MongoDB, tags : [mongodb, databases]})> db.posts.ensureIndex({tags:1})
  • 70. RelacionamentosMuitos para Muitos
  • 71. > db.sites.insert({dominio: shamanime.com})> db.sites.insert({dominio: fef.br})> db.sites.find(){ "_id" : ObjectId("4d595b58e0ab4d700255d841"), "dominio" : "shamanime.com"}{ "_id" : ObjectId("4d595b62e0ab4d700255d842"), "dominio" : "fef.br"}
  • 72. > db.usuarios.insert({ nome: Jefferson, autorizacoes: [ ObjectId(4d595b58e0ab4d700255d841), ObjectId(4d595b62e0ab4d700255d842) ]})> db.usuarios.insert({ nome: Frederico, autorizacoes: [ ObjectId(4d595b62e0ab4d700255d842) ]})
  • 73. > var fef = db.sites.findOne({dominio:fef.br})> db.usuarios.find({autorizacoes:fef._id})// Jefferson e Frederico> var shamanime = db.sites.findOne({dominio:shamanime.com})> db.usuarios.find({autorizacoes:shamanime._id})// Jefferson
  • 74. > var jefferson = db.usuarios.findOne({nome:Jefferson})> db.sites.find({_id:{$in: jefferson.autorizacoes}})// shamanime.com e fef.br
  • 75. Check list:•SQL•NoSQL•Escalabilidade•MongoDB: Insert, consultas,agregação, relacionamentos•MongoDB: Update, delete, etc
  • 76. Teste você mesmo:http://try.mongodb.org/
  • 77. { nome: Jefferson Venerando, site: shamanime.com twitter: @shamanime forum: bsrf.shamanime.com }7º semestreSistemas de Informação - Fundação Educacional de Fernandópolis