Slide 1

Slide 1 text

Você tem dado em casa?

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

SQL

Slide 4

Slide 4 text

SQL Structured Query Language SELECT * FROM * WHERE 1 = 1;

Slide 5

Slide 5 text

SQL Apache Derby Caché DB2 Firebird HSQLDB SQLite PostgreSQL InterBase Microsoft Access Microsoft SQL Server MySQL Oracle

Slide 6

Slide 6 text

NoSQL Jefferson Q. Venerando

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

NoSQL?

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Escalability? •Escalabilidade vertical (scale up) •Aumentar poder do servidor. •Escalabilidade horizontal (scale out) •Aumentar quantidade de servidores.

Slide 12

Slide 12 text

NoSQL •Informações necessárias agrupadas no mesmo registro; •Sem relacionamentos =)

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

NoSQL •Mais complexo. •Guarda objeto e não registros. •Buscas são feitas pela navegação destes objetos. •Exemplos: •Neo4J •InfoGrid •BigData Graph store

Slide 17

Slide 17 text

NoSQL •São relacionais. •Tem características do NoSQL. •Dados armazenados em colunas, não em linhas. •Exemplos: •Vertica •MonetDB •LucidDB Column oriented store

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Wood in the cat

Slide 20

Slide 20 text

Manga?

Slide 21

Slide 21 text

•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

Slide 22

Slide 22 text

MongoDB •O equivalente a registros são documentos. •Sintaxe JSON.

Slide 23

Slide 23 text

JASON?

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Boer = { nome:"Marcelo Tadeu-deu-deu Boer", disciplinas: { { nome:"APS", semestre:{4, 5, 6} }, { nome:"LTP", semestre:5 } }, faculdade:"FEF" } db.testedb.save(Boer)

Slide 27

Slide 27 text

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. =(

Slide 28

Slide 28 text

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.

Slide 29

Slide 29 text

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"}}}

Slide 30

Slide 30 text

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.

Slide 31

Slide 31 text

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.

Slide 32

Slide 32 text

Na prática...

Slide 33

Slide 33 text

Database == Database

Slide 34

Slide 34 text

> show dbs admin bsp_development local > use bsp_development switched to db bsp_development > show collections clientes fornecedores funcionarios servicos system.indexes

Slide 35

Slide 35 text

Coleção == Tabela

Slide 36

Slide 36 text

> db.clientes bsp_development.clientes > db.clientes.count() 5 > db.clientes.find().forEach(function(doc) { print(tojson(doc)); });

Slide 37

Slide 37 text

Documento == Linha

Slide 38

Slide 38 text

{ "_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)", }

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

Funcionalidades similares Consultas dinâmicas

Slide 41

Slide 41 text

> 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})

Slide 42

Slide 42 text

> var cursor = db.cores.find() > cursor.next() { "_id" : ObjectId("4d56e8d3e0ab4d700255d829"), "nome" : "vermelho", "primaria" : true }

Slide 43

Slide 43 text

> 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 }

Slide 44

Slide 44 text

SELECT * FROM cores WHERE nome = 'verde'; > db.cores.find({nome:'verde'}) { "_id" : ObjectId("4d56e8e6e0ab4d700255d82a"), "nome" : "verde", "primaria" : true }

Slide 45

Slide 45 text

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" }

Slide 46

Slide 46 text

> 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 }

Slide 47

Slide 47 text

> db.pessoas.insert({nome:"Boer", idade:28}) > db.pessoas.insert({nome:"Tiago", idade:24}) > db.pessoas.insert({nome:"Guilherme", idade:39})

Slide 48

Slide 48 text

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 }

Slide 49

Slide 49 text

SELECT * FROM pessoas WHERE idade <= 24 > db.pessoas.find({idade: {$lte: 24}}) { "_id" : ObjectId("4d59491ee0ab4d700255d830"), "nome" : "Tiago", "idade" : 24 }

Slide 50

Slide 50 text

$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

Slide 51

Slide 51 text

$gt $gte $lt $lte $ne $in $nin $mod $all $size $exists $type $elemMatch $not $where

Slide 52

Slide 52 text

Funcionalidades similares Agregação

Slide 53

Slide 53 text

> db.cores.count() 6 > db.cores.count({primaria:true}) 3

Slide 54

Slide 54 text

> db.cores.distinct('nome') [ "amarelo", "azul", "laranja", "rosa", "verde", "vermelho" ] > db.pessoas.distinct('nome', {idade:24}) [ "Tiago" ]

Slide 55

Slide 55 text

> 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} ]

Slide 56

Slide 56 text

> 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']})

Slide 57

Slide 57 text

> var map = function() { this.tags.forEach(function(t) { emit(t, {count: 1}); }); } GROUP BY = MapReduce

Slide 58

Slide 58 text

> var reduce = function(key, values) { var count = 0; for(var i=0, len=values.lenght; i

Slide 59

Slide 59 text

> 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

Slide 60

Slide 60 text

> 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

Slide 61

Slide 61 text

Funcionalidades similares Relacionamentos

Slide 62

Slide 62 text

Relacionamentos Um para Muitos

Slide 63

Slide 63 text

1. Normalizado

Slide 64

Slide 64 text

// 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'});

Slide 65

Slide 65 text

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") }

Slide 66

Slide 66 text

SELECT * FROM posts WHERE id = {#comentario.id} > db.posts.find({_id: comentario.post_id}) { "_id" : ObjectId("4d5955a5e0ab4d700255d83d"), "titulo" : "Analise e Projeto de Sistemas" }

Slide 67

Slide 67 text

2. Embedded

Slide 68

Slide 68 text

// 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!'} ] })

Slide 69

Slide 69 text

> 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!"} ] }

Slide 70

Slide 70 text

> db.posts.find({'comentarios.nome':'Diego'}) > db.posts.find({ comentarios: { $elemMatch: {nome:'Diego'} } })

Slide 71

Slide 71 text

// 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!'} ] } ] })

Slide 72

Slide 72 text

> db.posts.insert({ titulo: 'MongoDB', tags : ['mongodb', 'databases'] }) > db.posts.ensureIndex({tags:1})

Slide 73

Slide 73 text

Relacionamentos Muitos para Muitos

Slide 74

Slide 74 text

> 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" }

Slide 75

Slide 75 text

> db.usuarios.insert({ nome: 'Jefferson', autorizacoes: [ ObjectId('4d595b58e0ab4d700255d841'), ObjectId('4d595b62e0ab4d700255d842') ] }) > db.usuarios.insert({ nome: 'Lucio', autorizacoes: [ ObjectId('4d595b62e0ab4d700255d842') ] })

Slide 76

Slide 76 text

> 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

Slide 77

Slide 77 text

> var jefferson = db.usuarios.findOne({nome:'Jefferson'}) > db.sites.find({_id:{$in: jefferson.autorizacoes}}) // shamanime.com e brassun.com.br

Slide 78

Slide 78 text

Check list: •SQL •NoSQL •Escalabilidade •MongoDB: Insert, consultas, agregação, relacionamentos •MongoDB: Update, delete, etc

Slide 79

Slide 79 text

Teste você mesmo: http://try.mongodb.org/

Slide 80

Slide 80 text

Antes que eu me esqueça: GridFS •Armazenar arquivos no banco de dados. •Qualquer tipo. •GridFS + Replicação + Sharding = WIN!

Slide 81

Slide 81 text

nosqlsummer.org

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

{ nome: 'Jefferson Venerando', site: 'shamanime.com' twitter: '@shamanime' empresa: 'brassun.com.br' }