NoSQL e MongoDB - ETEC

1.461 visualizações

Publicada em

Material apresentado na semana de Informática da ETEC de Fernandópolis sobre NoSQL e MongoDB.

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.461
No SlideShare
0
A partir de incorporações
0
Número de incorporações
7
Ações
Compartilhamentos
0
Downloads
51
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • \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
  • \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 - ETEC

    1. 1. Você tem dadoem casa?
    2. 2. SQL
    3. 3. SQL Structured Query LanguageSELECT * FROM * WHERE 1 = 1;
    4. 4. SQLApache Derby PostgreSQLCaché InterBaseDB2 Microsoft AccessFirebird Microsoft SQL ServerHSQLDB MySQLSQLite Oracle
    5. 5. NoSQLJefferson Q. Venerando
    6. 6. NoSQL?
    7. 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. 8. NoSQL•Vieram para suprir necessidades dos BDtradicionais;•Alta performance, escalabilidade, replicação,suporte à dados estruturados e sub colunas.
    9. 9. Escalability?•Escalabilidade vertical (scale up) •Aumentar poder do servidor.•Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.
    10. 10. NoSQL•Informações necessárias agrupadas nomesmo registro;•Sem relacionamentos =)
    11. 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. 12. NoSQL Wide column store•Fortemente inspirados pelo BigTable dogoogle, suportam várias linhas e colunas alémde subcolunas.•Outros exemplos: •HBase (Yahoo) •HiperTable •Cassandra (Facebook e Digg)
    13. 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. 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. 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. 16. NoSQL Document oriented store•Baseados em documentos XML ou JSON.•Localização por ID único ou qualquer registrodo documento.•Exemplos: •CouchDB (Apache) •MongoDB (Engine Yard) •Riak
    17. 17. Wood in the cat
    18. 18. Manga?
    19. 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. 20. MongoDB•O equivalente a registros são documentos.•Sintaxe JSON.
    21. 21. JASON?
    22. 22. JSON - JavaScript Object NotationNele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depoisdessa palestra."} Mimimi...
    23. 23. Nele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depoisdessa palestra."}db.testedb.save(Nele)
    24. 24. Boer = { nome:"Marcelo Tadeu-deu-deu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF"}db.testedb.save(Boer)
    25. 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. 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. 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. 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. 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. 30. Na prática...
    31. 31. Database == Database
    32. 32. > show dbs admin bsp_development local> use bsp_development switched to db bsp_development> show collections clientes fornecedores funcionarios servicos system.indexes
    33. 33. Coleção == Tabela
    34. 34. > db.clientesbsp_development.clientes> db.clientes.count()5> db.clientes.find().forEach(function(doc) { print(tojson(doc));});
    35. 35. Documento == Linha
    36. 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. 37. Funcionalidades similares Consultas dinâmicas
    38. 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. 39. > var cursor = db.cores.find()> cursor.next(){ "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true}
    40. 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. 41. SELECT * FROM cores WHERE nome = verde;> db.cores.find({nome:verde}){ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
    42. 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. 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. 44. > db.pessoas.insert({nome:"Boer", idade:28})> db.pessoas.insert({nome:"Tiago", idade:24})> db.pessoas.insert({nome:"Guilherme", idade:39})
    45. 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. 46. SELECT * FROM pessoas WHERE idade <= 24> db.pessoas.find({idade: {$lte: 24}}){ "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
    47. 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. 48. $gt $all$gte $size$lt $exists$lte $type$ne $elemMatch$in $not$nin $where$mod
    49. 49. Funcionalidades similares Agregação
    50. 50. > db.cores.count()6> db.cores.count({primaria:true})3
    51. 51. > db.cores.distinct(nome)[ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ]> db.pessoas.distinct(nome, {idade:24})[ "Tiago" ]
    52. 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. 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. 54. GROUP BY = MapReduce> var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); }
    55. 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. 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. 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. 58. Funcionalidades similares Relacionamentos
    59. 59. Relacionamentos Um para Muitos
    60. 60. 1. Normalizado
    61. 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, meu rei!, post_id : post._id});> var comentario = db.comentarios.findOne({nome:Jefferson});
    62. 62. SELECT * FROM comentarios WHERE post_id = {#post.id}> db.comentarios.find({post_id: post._id}){ "_id" : ObjectId("4d5955f1e0ab4d700255d83e"), "nome" : "Jefferson", "corpo" : "Awo Boer, meu rei!", "post_id" : ObjectId("4d5955a5e0ab4d700255d83d")}
    63. 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. 64. 2. Embedded
    65. 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. 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. 67. > db.posts.find({comentarios.nome:Diego})> db.posts.find({ comentarios: { $elemMatch: {nome:Diego} }})
    68. 68. // inserir posts, comentários e respostas> db.posts.insert({ titulo:LTP, comentarios: [ { nome:Jefferson, corpo:MVC neles Tiaguinho!, comentarios: [ {nome:Elen, corpo:Não to entendendo nada.}, {nome:Jefferson, corpo:Para de chorar!} ] } ]})
    69. 69. > db.posts.insert({ titulo: MongoDB, tags : [mongodb, databases]})> db.posts.ensureIndex({tags:1})
    70. 70. RelacionamentosMuitos para Muitos
    71. 71. > db.sites.insert({dominio: shamanime.com})> db.sites.insert({dominio: brassun.com.br})> db.sites.find(){ "_id" : ObjectId("4d595b58e0ab4d700255d841"), "dominio" : "shamanime.com"}{ "_id" : ObjectId("4d595b62e0ab4d700255d842"), "dominio" : "brassun.com.br"}
    72. 72. > db.usuarios.insert({ nome: Jefferson, autorizacoes: [ ObjectId(4d595b58e0ab4d700255d841), ObjectId(4d595b62e0ab4d700255d842) ]})> db.usuarios.insert({ nome: Lucio, autorizacoes: [ ObjectId(4d595b62e0ab4d700255d842) ]})
    73. 73. > var bs = db.sites.findOne({dominio:brassun.com.br})> db.usuarios.find({autorizacoes:bs._id})// Jefferson e Lucio> var shamanime = db.sites.findOne({dominio:shamanime.com})> db.usuarios.find({autorizacoes:shamanime._id})// Jefferson
    74. 74. > var jefferson = db.usuarios.findOne({nome:Jefferson})> db.sites.find({_id:{$in: jefferson.autorizacoes}})// shamanime.com e brassun.com.br
    75. 75. Check list:•SQL•NoSQL•Escalabilidade•MongoDB: Insert, consultas,agregação, relacionamentos•MongoDB: Update, delete, etc
    76. 76. Teste você mesmo:http://try.mongodb.org/
    77. 77. Antes que eu me esqueça: GridFS •Armazenar arquivos no banco de dados. •Qualquer tipo. •GridFS + Replicação + Sharding = WIN!
    78. 78. nosqlsummer.org
    79. 79. { nome: Jefferson Venerando, site: shamanime.com twitter: @shamanime empresa: brassun.com.br}

    ×