Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NoSQL and MongoDB

NoSQL and MongoDB

An introduction to NoSQL and MongoDB!

Jefferson Venerando

June 19, 2012
Tweet

More Decks by Jefferson Venerando

Other Decks in Programming

Transcript

  1. SQL

  2. SQL Apache Derby Caché DB2 Firebird HSQLDB SQLite PostgreSQL InterBase

    Microsoft Access Microsoft SQL Server MySQL Oracle
  3. NoSQL •Usado em 1998 como o nome de um BD

    relacional open source sem interface SQL; •“Completamente distinto do modelo relacional”; •Deveria ser chamado NoREL; •Voltou a ser usado em 2009 em um evento sobre banco de dados open source distribuídos.
  4. NoSQL •Vieram para suprir necessidades dos BD tradicionais; •Alta performance,

    escalabilidade, replicação, suporte à dados estruturados e sub colunas.
  5. NoSQL •Existem vários tipos; •São divididos pela forma usada para

    trabalhar com seus dados: •Wide column store •Key/value store •Graph store •Column oriented store •Document store
  6. NoSQL •Fortemente inspirados pelo BigTable do google, suportam várias linhas

    e colunas além de subcolunas. •Outros exemplos: •HBase (Yahoo) •HiperTable •Cassandra (Facebook e Digg) Wide column store
  7. NoSQL •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 Key/value store
  8. NoSQL •Mais complexo. •Guarda objeto e não registros. •Buscas são

    feitas pela navegação destes objetos. •Exemplos: •Neo4J •InfoGrid •BigData Graph store
  9. NoSQL •São relacionais. •Tem características do NoSQL. •Dados armazenados em

    colunas, não em linhas. •Exemplos: •Vertica •MonetDB •LucidDB Column oriented store
  10. NoSQL •Baseados em documentos XML ou JSON. •Localização por ID

    único ou qualquer registro do documento. •Exemplos: •CouchDB (Apache) •MongoDB (Engine Yard) •Riak Document oriented store
  11. •Modelo relacional: representa mundo real (que é n-dimensional) usando abordagem

    bidimensional. •Podemos melhorar isso com análise, mas posteriormente um outro atributo pode ser encontrado. Orientado a Documentos MongoDB
  12. JSON - JavaScript Object Notation Nele = { nome:"Elen Carla

    D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depois dessa palestra." } Mimimi...
  13. Boer = { nome:"Marcelo Tadeu-deu-deu Boer", disciplinas: { { nome:"APS",

    semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF" } db.testedb.save(Boer)
  14. Eae? •Representamos objetos do mundo real da forma como eles

    são: complexos e únicos. =) •Se precisar de novos atributos, eles serão criados apenas onde for necessário. =) •Desenvolvedor precisa tomar cuidado pro banco não virar a casa da mãe Joana. =(
  15. Redundância de dados over 9000 •Modelo relacional: Reduzir o máximo

    possível a redundância de dados(formas normais, relacionamentos). •MongoDB: Sem relacionamentos, duplicação não é um problema.
  16. 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"}}}
  17. Redundância de dados over 9000 •Não há tabelas: há coleções

    de documentos. •O documento é meu e eu guardo o que eu quiser nele. •Documentos devem ser auto-contidos. •Uma única consulta retorna o documento inteiro.
  18. Então? •Mais performance. Uma consulta retorna tudo o que precisa

    a respeito do documento. =) •Alterar todos registros relacionados a uma unidade semântica requer tratamento um a um.
  19. > show dbs admin bsp_development local > use bsp_development switched

    to db bsp_development > show collections clientes fornecedores funcionarios servicos system.indexes
  20. { "_id" : ObjectId("4cee87ac271cd3146e00002a"), "ativo" : true, "nome" : "Ryu",

    "email" : "[email protected]", "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)", }
  21. > use teste switched 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})
  22. > var cursor = db.cores.find() > cursor.next() { "_id" :

    ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true }
  23. > 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 }
  24. SELECT * FROM cores WHERE nome = 'verde'; > db.cores.find({nome:'verde'})

    { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
  25. 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" }
  26. > 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 }
  27. 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 }
  28. SELECT * FROM pessoas WHERE idade <= 24 > db.pessoas.find({idade:

    {$lte: 24}}) { "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
  29. $bot_add $bot_add_ct $bot_add_tr $bot_kill $bot_difficulty 0 $bot_difficulty 2 $bot_difficulty 3

    $bot_difficulty 4 $bot_kick $bot_kick x $bot_knives only $bot_pistols_only $bot_snipers_only $bot_all_weapons $bot_allow_shield x
  30. $gt $gte $lt $lte $ne $in $nin $mod $all $size

    $exists $type $elemMatch $not $where
  31. > 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} ]
  32. > 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']})
  33. > 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}; } GROUP BY = MapReduce
  34. > 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 } } GROUP BY = MapReduce
  35. > db[result.result].find() { "_id" : "cachorro", "value" : { "count"

    : 6 } } { "_id" : "gato", "value" : { "count" : 1 } } { "_id" : "macaco", "value" : { "count" : 3 } } { "_id" : "rato", "value" : { "count" : 3 } } GROUP BY = MapReduce
  36. // inserir post > db.posts.insert({titulo:'Analise e Projeto de Sistemas'}); >

    var post = db.posts.findOne({titulo:'Analise e Projeto de Sistemas'}); // inserir comentario > db.comentarios.insert({ nome:'Jefferson', corpo:'Awo Boer, meu rei!', post_id : post._id }); > var comentario = db.comentarios.findOne({nome:'Jefferson'});
  37. 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") }
  38. SELECT * FROM posts WHERE id = {#comentario.id} > db.posts.find({_id:

    comentario.post_id}) { "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas" }
  39. // 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!'} ] })
  40. > 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!"} ] }
  41. // 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!'} ] } ] })
  42. > 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" }
  43. > db.usuarios.insert({ nome: 'Jefferson', autorizacoes: [ ObjectId('4d595b58e0ab4d700255d841'), ObjectId('4d595b62e0ab4d700255d842') ] })

    > db.usuarios.insert({ nome: 'Lucio', autorizacoes: [ ObjectId('4d595b62e0ab4d700255d842') ] })
  44. > 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
  45. Antes que eu me esqueça: GridFS •Armazenar arquivos no banco

    de dados. •Qualquer tipo. •GridFS + Replicação + Sharding = WIN!