SlideShare uma empresa Scribd logo
1 de 83
Você tem dado
em casa?
SQL
SQL
 Structured Query Language


SELECT * FROM * WHERE 1 = 1;
SQL
Apache Derby     PostgreSQL
Caché            InterBase
DB2              Microsoft Access
Firebird         Microsoft SQL Server
HSQLDB           MySQL
SQLite           Oracle
NoSQL
Jefferson Q. Venerando
NoSQL?
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.
NoSQL


•Vieram para suprir necessidades dos BD
tradicionais;
•Alta performance, escalabilidade, replicação,
suporte à dados estruturados e sub colunas.
Escalability?

•Escalabilidade vertical (scale up)
  •Aumentar poder do servidor.


•Escalabilidade horizontal (scale out)
  •Aumentar quantidade de servidores.
NoSQL


•Informações necessárias agrupadas no
mesmo registro;
•Sem relacionamentos =)
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
NoSQL
            Wide column store

•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)
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
NoSQL
               Graph store
•Mais complexo.
•Guarda objeto e não registros.
•Buscas são feitas pela navegação destes
objetos.
•Exemplos:
  •Neo4J
  •InfoGrid
  •BigData
NoSQL
          Column oriented store
•São relacionais.
•Tem características do NoSQL.
•Dados armazenados em colunas, não em
linhas.
•Exemplos:
  •Vertica
  •MonetDB
  •LucidDB
NoSQL
        Document oriented store

•Baseados em documentos XML ou JSON.
•Localização por ID único ou qualquer registro
do documento.
•Exemplos:
  •CouchDB (Apache)
  •MongoDB (Engine Yard)
  •Riak
Wood in the cat
Manga?
MongoDB
        Orientado a Documentos

•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.
MongoDB


•O equivalente a registros são documentos.
•Sintaxe JSON.
JASON?
JSON - JavaScript Object Notation

Nele = {
  nome:"Elen Carla D. O.",
  cidade:"Indiaporã",
  pensamento:"Vou matar alguém depois
dessa palestra."
}



                             Mimimi...
Nele = {
  nome:"Elen Carla D. O.",
  cidade:"Indiaporã",
  pensamento:"Vou matar alguém depois
dessa palestra."
}
db.testedb.save(Nele)
Boer = {
  nome:"Marcelo Tadeu-deu-deu Boer",
  disciplinas: {
     {
        nome:"APS",
        semestre:{4, 5, 6}
     },
     {
        nome:"LTP",
        semestre:5
     }
  },
  faculdade:"FEF"
}

db.testedb.save(Boer)
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. =(
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.
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"}}}
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.
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.
Na prática...
Database == Database
> show dbs
    admin
    bsp_development
    local
> use bsp_development
    switched to db bsp_development
> show collections
    clientes
    fornecedores
    funcionarios
    servicos
    system.indexes
Coleção == Tabela
> db.clientes
bsp_development.clientes

> db.clientes.count()
5

> db.clientes.find().forEach(function(doc) {
  print(tojson(doc));
});
Documento == Linha
{
  "_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)",
}
Funcionalidades similares

    Consultas dinâmicas
> 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})
> var cursor = db.cores.find()
> cursor.next()
{
  "_id" : ObjectId("4d56e8d3e0ab4d700255d829"),
  "nome" : "vermelho",
  "primaria" : true
}
> 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 }
SELECT * FROM cores WHERE nome = 'verde';

> db.cores.find({nome:'verde'})
{ "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
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" }
> 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 }
> db.pessoas.insert({nome:"Boer",      idade:28})
> db.pessoas.insert({nome:"Tiago",     idade:24})
> db.pessoas.insert({nome:"Guilherme", idade:39})
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 }
SELECT * FROM pessoas WHERE idade <= 24

> db.pessoas.find({idade: {$lte: 24}})
{ "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
$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
$gt
       $all
$gte
       $size
$lt
       $exists
$lte
       $type
$ne
       $elemMatch
$in
       $not
$nin
       $where
$mod
Funcionalidades similares

        Agregação
> db.cores.count()
6
> db.cores.count({primaria:true})
3
> db.cores.distinct('nome')
[ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ]


> db.pessoas.distinct('nome', {idade:24})
[ "Tiago" ]
>   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}
]
>   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']})
GROUP BY = MapReduce


> var map = function() {
    this.tags.forEach(function(t) {
      emit(t, {count: 1});
    });
  }
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};
  }
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
  }
}
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   }   }
Funcionalidades similares

     Relacionamentos
Relacionamentos

 Um para Muitos
1. Normalizado
// 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'});
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")
}
SELECT * FROM posts WHERE id = {#comentario.id}

> db.posts.find({_id: comentario.post_id})
{
  "_id" : ObjectId("4d5955a5e0ab4d700255d83d"),
  "titulo" : "Analise e Projeto de Sistemas"
}
2. Embedded
// 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!'}
   ]
})
> 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!"}
  ]
}
> db.posts.find({'comentarios.nome':'Diego'})
> db.posts.find({
   comentarios: {
     $elemMatch: {nome:'Diego'}
   }
})
// 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!'}
       ]
     }
   ]
})
> db.posts.insert({
   titulo: 'MongoDB',
   tags : ['mongodb', 'databases']
})
> db.posts.ensureIndex({tags:1})
Relacionamentos

Muitos para Muitos
> 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"
}
> db.usuarios.insert({
   nome: 'Jefferson',
   autorizacoes: [
     ObjectId('4d595b58e0ab4d700255d841'),
     ObjectId('4d595b62e0ab4d700255d842')
   ]
})

> db.usuarios.insert({
   nome: 'Lucio',
   autorizacoes: [
     ObjectId('4d595b62e0ab4d700255d842')
   ]
})
> 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
> var jefferson = db.usuarios.findOne({nome:'Jefferson'})
> db.sites.find({_id:{$in: jefferson.autorizacoes}})
// shamanime.com e brassun.com.br
Check list:

•SQL
•NoSQL
•Escalabilidade
•MongoDB: Insert, consultas,
agregação, relacionamentos
•MongoDB: Update, delete, etc
Teste você mesmo:

http://try.mongodb.org/
Antes que eu me esqueça:
           GridFS
  •Armazenar arquivos no banco de dados.
  •Qualquer tipo.
  •GridFS + Replicação + Sharding = WIN!
nosqlsummer.org
{
    nome:      'Jefferson Venerando',
    site:      'shamanime.com'
    twitter:   '@shamanime'
    empresa:   'brassun.com.br'
}

Mais conteúdo relacionado

Mais procurados

Minicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIMinicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIBruna Pereira
 
Nosql e BD Orientados a Documentos
Nosql e BD Orientados a DocumentosNosql e BD Orientados a Documentos
Nosql e BD Orientados a DocumentosYuri Adams
 
Mongo DB
Mongo DBMongo DB
Mongo DBdist_bp
 
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
 
MongoDB - Tudo o que você precisa saber - FISL16
MongoDB - Tudo o que você precisa saber - FISL16MongoDB - Tudo o que você precisa saber - FISL16
MongoDB - Tudo o que você precisa saber - FISL16Christiano Anderson
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBElaine Naomi
 
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 Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014Christiano Anderson
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeGabriela Ferrara
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajoliCaue Fajoli
 
Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionariossamuelthiago
 
MySQL 5.7 - 
Tirando o Máximo Proveito
MySQL 5.7 - 
Tirando o Máximo ProveitoMySQL 5.7 - 
Tirando o Máximo Proveito
MySQL 5.7 - 
Tirando o Máximo ProveitoGabriela Ferrara
 
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
 

Mais procurados (20)

Minicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIMinicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTI
 
Nosql e BD Orientados a Documentos
Nosql e BD Orientados a DocumentosNosql e BD Orientados a Documentos
Nosql e BD Orientados a Documentos
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
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...
 
MongoDB
MongoDBMongoDB
MongoDB
 
MongoDB - Tudo o que você precisa saber - FISL16
MongoDB - Tudo o que você precisa saber - FISL16MongoDB - Tudo o que você precisa saber - FISL16
MongoDB - Tudo o que você precisa saber - FISL16
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao 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
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
 
MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
 
jQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê Fajoli
 
Mongodb workshop cinlug
Mongodb workshop cinlugMongodb workshop cinlug
Mongodb workshop cinlug
 
Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionarios
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
MySQL 5.7 - 
Tirando o Máximo Proveito
MySQL 5.7 - 
Tirando o Máximo ProveitoMySQL 5.7 - 
Tirando o Máximo Proveito
MySQL 5.7 - 
Tirando o Máximo Proveito
 
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
 

Destaque

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
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
MongoDB: introdução à sua próxima base de dados
MongoDB:  introdução à sua próxima base de dadosMongoDB:  introdução à sua próxima base de dados
MongoDB: introdução à sua próxima base de dadosJordan Kobellarz
 
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
 
No sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbNo sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbfabio perrella
 
Comparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLComparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLpichiliani
 
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosDesmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosFabíola Fernandes
 
NoSQL, Base VS ACID e Teorema CAP
NoSQL, Base VS ACID e Teorema CAPNoSQL, Base VS ACID e Teorema CAP
NoSQL, Base VS ACID e Teorema CAPAricelio Souza
 
Modelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaModelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaGlaucio Scheibel
 
NoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBNoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBRodrigo Hjort
 
NoSQL - Por que e quando usar?
NoSQL - Por que e quando usar?NoSQL - Por que e quando usar?
NoSQL - Por que e quando usar?Nico Steppat
 

Destaque (14)

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
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
MongoDB: introdução à sua próxima base de dados
MongoDB:  introdução à sua próxima base de dadosMongoDB:  introdução à sua próxima base de dados
MongoDB: introdução à sua próxima base de dados
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
Introdução ao NoSql
Introdução ao NoSqlIntrodução ao NoSql
Introdução ao NoSql
 
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
 
No sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbNo sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodb
 
Comparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLComparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQL
 
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosDesmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
 
NoSQL, Base VS ACID e Teorema CAP
NoSQL, Base VS ACID e Teorema CAPNoSQL, Base VS ACID e Teorema CAP
NoSQL, Base VS ACID e Teorema CAP
 
Modelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaModelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência Poliglota
 
NoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDBNoSQL: onde, como e por quê? Cassandra e MongoDB
NoSQL: onde, como e por quê? Cassandra e MongoDB
 
NOSQL
NOSQLNOSQL
NOSQL
 
NoSQL - Por que e quando usar?
NoSQL - Por que e quando usar?NoSQL - Por que e quando usar?
NoSQL - Por que e quando usar?
 

Semelhante a NoSQL e MongoDB - ETEC

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
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesDerek Willian Stavis
 
MongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggMongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggFelipe Guimarães
 
MongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéMongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéWagner Bonfiglio
 
Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Junior Fernandes
 
Spring Data com MongoDB
Spring Data com MongoDBSpring Data com MongoDB
Spring Data com MongoDBFabiano Modos
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Big Data Week São Paulo
 
MySQL + JSON da casamento sim!
MySQL + JSON da casamento sim!MySQL + JSON da casamento sim!
MySQL + JSON da casamento sim!Diego Hellas
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
Document store e Mongodb
Document store e MongodbDocument store e Mongodb
Document store e MongodbAline Ferreira
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodbThiago Avelino
 
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
 
Indexando e Ordenando Data Sets
Indexando e Ordenando Data SetsIndexando e Ordenando Data Sets
Indexando e Ordenando Data SetsRodolfo Mendes
 

Semelhante a NoSQL e MongoDB - ETEC (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
 
Introdução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slidesIntrodução ao MongoDB em 30 slides
Introdução ao MongoDB em 30 slides
 
Minicurso mongo db
Minicurso mongo dbMinicurso mongo db
Minicurso mongo db
 
MongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - NaveggMongoDB - Wagner Bonfiglio - Navegg
MongoDB - Wagner Bonfiglio - Navegg
 
MongoDB - Workshop Buscapé
MongoDB - Workshop BuscapéMongoDB - Workshop Buscapé
MongoDB - Workshop Buscapé
 
Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)Introdução ao nosql (mini curso)
Introdução ao nosql (mini curso)
 
Spring Data com MongoDB
Spring Data com MongoDBSpring Data com MongoDB
Spring Data com MongoDB
 
Mongo db slides
Mongo db slidesMongo db slides
Mongo db slides
 
MAC5855 - NoSQL
MAC5855 - NoSQLMAC5855 - NoSQL
MAC5855 - NoSQL
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
 
MySQL + JSON da casamento sim!
MySQL + JSON da casamento sim!MySQL + JSON da casamento sim!
MySQL + JSON da casamento sim!
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Aprendendo R
Aprendendo RAprendendo R
Aprendendo R
 
Document store e Mongodb
Document store e MongodbDocument store e Mongodb
Document store e Mongodb
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodb
 
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
 
Indexando e Ordenando Data Sets
Indexando e Ordenando Data SetsIndexando e Ordenando Data Sets
Indexando e Ordenando Data Sets
 

NoSQL e MongoDB - ETEC

  • 2.
  • 3. SQL
  • 4. SQL Structured Query Language SELECT * FROM * WHERE 1 = 1;
  • 5. SQL Apache Derby PostgreSQL Caché InterBase DB2 Microsoft Access Firebird Microsoft SQL Server HSQLDB MySQL SQLite Oracle
  • 7.
  • 9. 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.
  • 10. NoSQL •Vieram para suprir necessidades dos BD tradicionais; •Alta performance, escalabilidade, replicação, suporte à dados estruturados e sub colunas.
  • 11. Escalability? •Escalabilidade vertical (scale up) •Aumentar poder do servidor. •Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.
  • 12. NoSQL •Informações necessárias agrupadas no mesmo registro; •Sem relacionamentos =)
  • 13. 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
  • 14. NoSQL Wide column store •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)
  • 15. 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
  • 16. NoSQL Graph store •Mais complexo. •Guarda objeto e não registros. •Buscas são feitas pela navegação destes objetos. •Exemplos: •Neo4J •InfoGrid •BigData
  • 17. NoSQL Column oriented store •São relacionais. •Tem características do NoSQL. •Dados armazenados em colunas, não em linhas. •Exemplos: •Vertica •MonetDB •LucidDB
  • 18. NoSQL Document oriented store •Baseados em documentos XML ou JSON. •Localização por ID único ou qualquer registro do documento. •Exemplos: •CouchDB (Apache) •MongoDB (Engine Yard) •Riak
  • 19. Wood in the cat
  • 21. MongoDB Orientado a Documentos •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.
  • 22. MongoDB •O equivalente a registros são documentos. •Sintaxe JSON.
  • 24. JSON - JavaScript Object Notation Nele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depois dessa palestra." } Mimimi...
  • 25. Nele = { nome:"Elen Carla D. O.", cidade:"Indiaporã", pensamento:"Vou matar alguém depois dessa palestra." } db.testedb.save(Nele)
  • 26. Boer = { nome:"Marcelo Tadeu-deu-deu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF" } db.testedb.save(Boer)
  • 27. 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. =(
  • 28. 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.
  • 29. 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"}}}
  • 30. 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.
  • 31. 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.
  • 34. > show dbs admin bsp_development local > use bsp_development switched to db bsp_development > show collections clientes fornecedores funcionarios servicos system.indexes
  • 36. > db.clientes bsp_development.clientes > db.clientes.count() 5 > db.clientes.find().forEach(function(doc) { print(tojson(doc)); });
  • 38. { "_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)", }
  • 39.
  • 40. Funcionalidades similares Consultas dinâmicas
  • 41. > 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})
  • 42. > var cursor = db.cores.find() > cursor.next() { "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true }
  • 43. > 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 }
  • 44. SELECT * FROM cores WHERE nome = 'verde'; > db.cores.find({nome:'verde'}) { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }
  • 45. 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" }
  • 46. > 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 }
  • 47. > db.pessoas.insert({nome:"Boer", idade:28}) > db.pessoas.insert({nome:"Tiago", idade:24}) > db.pessoas.insert({nome:"Guilherme", idade:39})
  • 48. 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 }
  • 49. SELECT * FROM pessoas WHERE idade <= 24 > db.pessoas.find({idade: {$lte: 24}}) { "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }
  • 50. $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
  • 51. $gt $all $gte $size $lt $exists $lte $type $ne $elemMatch $in $not $nin $where $mod
  • 54. > db.cores.distinct('nome') [ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ] > db.pessoas.distinct('nome', {idade:24}) [ "Tiago" ]
  • 55. > 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} ]
  • 56. > 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']})
  • 57. GROUP BY = MapReduce > var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); }
  • 58. 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}; }
  • 59. 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 } }
  • 60. 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 } }
  • 61. Funcionalidades similares Relacionamentos
  • 64. // 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'});
  • 65. 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") }
  • 66. SELECT * FROM posts WHERE id = {#comentario.id} > db.posts.find({_id: comentario.post_id}) { "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas" }
  • 68. // 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!'} ] })
  • 69. > 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!"} ] }
  • 70. > db.posts.find({'comentarios.nome':'Diego'}) > db.posts.find({ comentarios: { $elemMatch: {nome:'Diego'} } })
  • 71. // 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!'} ] } ] })
  • 72. > db.posts.insert({ titulo: 'MongoDB', tags : ['mongodb', 'databases'] }) > db.posts.ensureIndex({tags:1})
  • 74. > 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" }
  • 75. > db.usuarios.insert({ nome: 'Jefferson', autorizacoes: [ ObjectId('4d595b58e0ab4d700255d841'), ObjectId('4d595b62e0ab4d700255d842') ] }) > db.usuarios.insert({ nome: 'Lucio', autorizacoes: [ ObjectId('4d595b62e0ab4d700255d842') ] })
  • 76. > 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
  • 77. > var jefferson = db.usuarios.findOne({nome:'Jefferson'}) > db.sites.find({_id:{$in: jefferson.autorizacoes}}) // shamanime.com e brassun.com.br
  • 78. Check list: •SQL •NoSQL •Escalabilidade •MongoDB: Insert, consultas, agregação, relacionamentos •MongoDB: Update, delete, etc
  • 80. Antes que eu me esqueça: GridFS •Armazenar arquivos no banco de dados. •Qualquer tipo. •GridFS + Replicação + Sharding = WIN!
  • 82.
  • 83. { nome: 'Jefferson Venerando', site: 'shamanime.com' twitter: '@shamanime' empresa: 'brassun.com.br' }

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n