The Real-time Web




        Utilizando NoSQL para
         desenvolvimento de
         soluções inteligentes


Christiano Anderson               Nodeware
Diretor de desenvolvimento        http://www.nodeware.com.br
Email: anderson@nodeware.com.br   Twitter: @nodeware
Twitter: @dump
Blog: http://christiano.me
Sobre o autor
•   Trabalha com software livre desde 1995;

•   Diretor de Desenvolvimento da Nodeware;

•   Ex-desenvolvedor do projeto GNU;

•   Trabalha com Python desde 2000;

•   Evangelista NoSQL, Django e Node.JS;

•   Colabora com equipe de tradução do MongoDB;

•   Fundador do MUG-SP;



@dump
Sobre a Nodeware

•   Empresa nova mas com profissionais que
    participaram do início da internet comercial do
    Brasil;

•   Foco em soluções emergentes, cloud, NoSQL,
    Node.JS e gestão de conteúdo (CMS);

•   Parceira 10gen e Amazon AWS;

•   Mais em http://www.nodeware.com.br



      @dump
NoSQL?

•   O termo foi cunhado por Carlo Strozzi e
    reintroduzido por Eric Evans, como referência a
    um tipo de armazenamento de dados;

•   O uso recomendado é Not Only SQL e nunca
    deve ser usado como “Não-SQL” ou “Never SQL”;

•   O movimento NoSQL é distinto do modelo
    relacional, o termo NoREL também é bastante
    apropriado.


      @dump
NoSQL?


“Non-relational next generation operational
       datastores and databases”



                        Dwight Merriman, CEO 10gen




  @dump
NoSQL?


“NoSQL is a movement promoting a loosely defined class of
 non-relational data stores that break with a long history of
relational databases.These data stores may not require fixed
  table schemas, usually avoid join operations and typically
  scale horizontally. Academics and papers typically refer to
            these databases as structured storage.”

                                                  Wikipedia




       @dump
Por que NoSQL?


• É uma questão de escolha, novos
  paradigmas (nem tão novos assim);
• É uma questão de funcionalidades;
• Performance e Escalabilidade;
• Não é questão de “ódio ao modelo SQL”;

    @dump
Por que NoSQL?

•   Para trabalhar com uma massa enorme de dados
    que...

    •   ... crescem exponencialmente;

    •   ... agregam muitos outros valores
        dinamicamente;

    •   ... exigem um formato diferenciado de dados;

    •   ... não exigem um banco relacional, mas podem
        trabalhar em conjunto com um.


        @dump
Por que NoSQL?

•   Para trabalhar com uma massa enorme de dados
    que...

    •   ... crescem exponencialmente;        Enorme é bastante
                                                 relativo

    •   ... agregam muitos outros valores
        dinamicamente;

    •   ... exigem um formato diferenciado de dados;

    •   ... não exigem um banco relacional, mas podem
        trabalhar em conjunto com um.


        @dump
Orientação a documentos




@dump
Orientação a documentos


•   Dados estruturados de forma encadeada, podendo
    ser coleções, tags, metadatas, hierarquias de
    informações, etc.

•   Exemplo de documento:
    nome:”Christiano”,empresa:”Nodeware”,contatos:
    [{twitter:”@dump”},{email:”anderson@nodeware.com.br”}]

•   Bom para aplicações de conteúdo, blogs, análise
    estatísticas, etc.


      @dump
Grafos




Twitter FlockDB




@dump
Grafos?
• Estrutura de nós, bordas e propriedades
  para representar dados;
• Todo elemento possui um apontamento
  direto para outro elemento adjacente;
• Bom para mídias sociais,
  determinar relacionamento
  entre dados e B.I.;



    @dump
Chave/Valor (k/v)



Amazon SimpleDB       MemcacheDB

                      Segue um modelo baseado em
                      colunas, mas que não deixa de
                       ser conceito chave/valor.




   @dump
Chave/Valor (k/v)

• Quase todos os bancos NoSQL possuem o
  conceito de chave/valor;
• Conceito para armazenar dados sem
  precisar de uma modelagem pré-definida;
• Os dados podem estar em colunas;
• A persistência dos dados pode ser em
  memória ou em disco;

    @dump
Qual é o melhor?




@dump
Resposta

  Depende do que você vai fazer!

As vezes pode precisar de mais de
         uma ferramenta




@dump
Motivos para adotar NoSQL
•   Grande quantidade de dados;

•   Ótima performance de escrita;

•   Rápido acesso chave-valor;

•   Modelagem flexível;

•   Migração fácil de dados;

•   Fácil para manter e administrar;

•   Sem pontos únicos de falha;

•   Facilidade no desenvolvimento;

      @dump
Por onde começar?


• Primeiro passo é saber o que você precisa;
• MongoDB possui uma baixa curva de
  aprendizado, ótimo para conhecer os
  conceitos NoSQL;
• MongoDB é o canivete suíço dos bancos
  NoSQL;


    @dump
MongoDB?


• Dois motivos para começar com
  MongoDB:
 • Baixa curva de aprendizado;
 • Agilidade no desenvolvimento;

    @dump
Você deve considerar o uso de MongoDB se...


•   Você está usando muito cache em sua aplicação;

•   Você está armazenando muitos dados em arquivos
    estáticos;

•   Você precisa de processamento em tempo real;

•   Você gosta de desenvolvimento ágil (SCRUM);

•   Você tem dificuldades para modelar sua estrutura
    de dados no conceito relacional;

•   Seu projeto faz muita gravação e leitura em banco
    de dados;

      @dump
O MongoDB substitui o banco relacional?




• Como já foi explicado, é uma questão de
  escolha;
• Uma aplicação pode usar banco relacional e
  NoSQL sem problema;




    @dump
Desenvolvimento

•   O MongoDB e outros bancos NoSQL suportam
    praticamente todas as linguagens de programação;

•   O MongoDB possui suporte oficial para:

    •   C, C++, Erlang, Haskell, Java, JavaScript, Perl, PHP,
        Python, .NET, Ruby, Scala, Go Language, Node.js,
        Lisp, Lua, Smalltalk...

•   Mais em: http://www.mongodb.org/display/DOCS/
    Drivers

        @dump
Modelo de Documento
Um modelo de documento MongoDB possui
          o seguinte formato:

     {‘nome’:‘Christiano’,
     ‘linguagem’:‘node.js’,
     ‘nota’: 10}

           Sim, é praticamente
                um JSON



   @dump
Comparando com SQL
               SQL                              MongoDB
INSERT INTO USERS VALUES(1,1)                db.users.insert({a:1, b:1})


      SELECT a,b FROM users                 db.users.find({}, {a: 1, b: 1})


       SELECT * FROM users                        db.users.find()


   SELECT * FROM users WHERE age=33           db.users.find({age: 33})


SELECT * FROm users WHERE name = “pedro”   db.users.find({name:”pedro”})




      @dump
Comparando com SQL
               SQL                                MongoDB
  SELECT * FROM users WHERE               db.users.find({‘age’:33}).sort({name:
     age=33 ORDER BY name                                 1})
SELECT * FROM users WHERE age
                                            db.users.find({‘age’:{$lt:33}})})
            < 33
CREATE INDEX myindexname ON
                                            db.users.ensureIndex({name:1})
         user(name)
SELECT * FROM users WHERE a = 1 AND b =
                   ‘q’                         db.users.find({a:1, b:’q’})


  SELECT * FROM users LIMIT 10 SKIP 20     db.users.find().limit(10).skip(20)




     @dump
Índices
•   Possui suporte a índices para ganho de
    performance;

•   O conceito é similar a bancos relacionais, como
    MySQL;

•   Exemplo:

    • db.colecao.ensureIndex({nome:1})
•   Mais: http://www.mongodb.org/display/DOCS/
    Indexes
      @dump
Replica Sets
•   Possível dividir a carga em vários servidores, replicando seu conteúdo via
    Replica Sets;


•   Possível crescer o ambiente de forma bastante orgânica;


•   Replica Set consiste em um ou mais node que replicam seus valores entre si.




                Server 1             Server 2

                                                               Somente leitura




                                            Leitura, Escrita
                                Primário
                                                               Cliente



       @dump
Sharding
•   MongoDB escala horizontalmente via auto-
    sharding, particionando pedaço de dados entre
    servidores;

•   Pode adicionar novos nodes facilmente sem
    interromper o sistema;

•   Possível escalar centenas e milhares de servidores;

•   Não tem ponto único de falha;

•   Failover automático;

      @dump
Python e MongoDB


•   Pymongo é o módulo que permite a conexão de
    qualquer aplicativo em Python ao MongoDB;

•   Instalado facilmente via pip ou easy_install:

•   pip install pymongo




      @dump
Código de exemplo



>>> from pymongo import Connection
>>> con = Connection(“localhost”)
>>> db = con[‘blog’]




     @dump
Inserindo um documento
>>> post = {'title':'My first post',
…'author': 'Christiano Anderson',
…'content': 'This is my first
paragraph', … 'tags':
['mongodb','blog','example']}

>>> posts = db['posts']

>>> posts.insert(post)
ObjectId('4cb662f508bf532b1b000000')


     @dump
Inserindo vários documentos

>>> other_posts = [{'title':'Second Post', 'author': 'Christiano
Anderson','tags':['test'], 'content': 'Hey, my second Post'},

{'title':'Third Post', 'author':'Luke Skywalker','tags':
['naboo'],'content':'Hey princess Leya'}]

>>> posts.insert(other_posts) [ObjectId('4cb6651b08bf532b97000000'),
ObjectId('4cb6651b08bf532b97000001')]




             @dump
Realizando pesquisas
>>> my_post = db.posts.find_one({})

{u'content': u'This is my first post at
MongoDB', u'title': u'My first post', u'_id':
ObjectId('4cb662f508bf532b1b000000'), u'tags':
[u'mongodb', u'blog', u'example'], u'author':
u'Christiano Anderson'}

>>> my_post = db.posts.find_one({ 'author':
'Christiano Anderson'})


         @dump
Operadores


•   Também é possível utilizar operadores como $ne,
    $lte, $gte,entre outros...

•   Mais: http://www.mongodb.org/display/DOCS/
    Advanced+Queries




      @dump
Consultas à base


>>> all_posts = db.posts.find({})

>>> for p in all_posts:
... print p['title']
My first post Second Post Third Post




    @dump
Filtros como parâmetros

>>> p = db.posts.find_one({'tags':'naboo'})

{u'content': u'Hey princess Leya', u'title':
u'Third Post', u'_id':
ObjectId('4cb6651b08bf532b97000001'),
u'tags': [u'naboo'], u'author': u'Luke
Skywalker'}




        @dump
Map/Reduce


• Utilizado para criar funções de pesquisa e
  agregadores no MongoDB;
• Utiliza-se JavaScript;
• Pode ser comparado a um Stored Procedure;

    @dump
Exemplo de Map/Reduce
function() {
     this.tags.forEach(function(z)) {
         emit(z, 1);
});}

function(key, value) {
    var total = 0;
    for(var i = 0; i < values.length;
i++) {
        total += values[i]; }
    return total;
}

     @dump
Falando um pouco de Riak




 @dump
Riak

• Implementado a partir de papers do
  Amazon DynamoDB;
• Escrito em Erlang;
• Seu modelo é baseado em chave/valor (kv);
• Muito, mas muito fácil para escalar;
• Riak-search oferece busca estilo Solr/
  Lucene;

    @dump
Buckets

• Buckets são utilizadas para definir um
  espaço virtual de dados;
• Podem ser comparadas a pastas ou tabelas,
  em sistemas operacionais ou banco de
  dados relacionais respectivamente;
• Essa é a única maneira de armazenar dados
  no Riak;


    @dump
Riak - Exemplos em Python

import riak

client = riak.RiakClient()

bucket = client.bucket('nodeware')

p = bucket.new('anderson', data = {
        'nome': 'Christiano Anderson',
        'empresa': 'Nodeware',
        'email': ‘anderson@nodeware.com.br’,
        })
p.store()




    @dump
Riak - Exemplos em Python

import riak                          Definição de Bucket
client = riak.RiakClient()

bucket = client.bucket('nodeware')

p = bucket.new('anderson', data = {
        'nome': 'Christiano Anderson',
        'empresa': 'Nodeware',
        'email': ‘anderson@nodeware.com.br’,
        })
p.store()




    @dump
Riak - Exemplos em Python

import riak                          Definição de Bucket
client = riak.RiakClient()

bucket = client.bucket('nodeware')

p = bucket.new('anderson', data = {
        'nome': 'Christiano Anderson',         Dados
        'empresa': 'Nodeware',
        'email': ‘anderson@nodeware.com.br’,
        })
p.store()




    @dump
Riak - Consultas ao banco
import riak

client = riak.RiakClient()
bucket = client.bucket('nodeware')

u = bucket.get('anderson')

print u.get_data()



     {u'idade': 33, u'empresa': u'Nodeware 3',
     u'nome': u'Christiano Anderson'}




     @dump
Outros bancos...




• Eu gostaria de falar mais dos outros
  bancos, mas o tempo já acabou :-(




    @dump
Fique informado


• http://nosql.mypopescu.com/
• http://nosql-database.org/
• http://christiano.me/
• Twitter: @dump @al3xandru

   @dump
Agora é sua vez!!!
        Christiano Anderson

Mail: anderson@nodeware.com.br

Site: http://www.nodeware.com.br

Blog: http://christiano.me

Twitter: @dump


@dump

Mais conteúdo relacionado

PDF
No sql e as vantagens na utilização do mongodb
PDF
Mongo db slides
PDF
Palestra nosql
PDF
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
PPTX
Estudo comparativo entr bancos RDBMS, NoSQL e NewSQL
PDF
Introdução ao NoSql
PPTX
Desenvolvemos para web?
ODP
NoSQL: onde, como e por quê? Cassandra e MongoDB
No sql e as vantagens na utilização do mongodb
Mongo db slides
Palestra nosql
Mais um comparativo MongoDB - Fernando Boaglio - abril.2014
Estudo comparativo entr bancos RDBMS, NoSQL e NewSQL
Introdução ao NoSql
Desenvolvemos para web?
NoSQL: onde, como e por quê? Cassandra e MongoDB

Mais procurados (20)

PDF
NoSQL com Zend Framework 2
PDF
Palestra iv-ensol-nosql
PPT
CouchDB Presentation
PDF
Apache CouchDB
PDF
REST Web Services com Java
PDF
noSQL com CouchDb e PHP
PPTX
No sql Orientado a documento
PDF
Conhecendo Apache Cassandra @Movile
PDF
Web Scale Data Management
PPTX
Apresentação MongoDB
PPTX
NOSQL uma breve introdução
PDF
Artigo couchdb
PPTX
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
PDF
MAC5855 - NoSQL
PDF
DBA Brasil 2.0 NOSql Apache Cassandra para DBAs
PPT
Interoperabilidade entre bancos de dados
PDF
Cassandra NoSQL JUG Vale 2012
PPTX
Desenvolvimento web - conceitos, tecnologia e tendências.
PPTX
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
PPT
Desenvolvimento web em java com JSP e Servlets
NoSQL com Zend Framework 2
Palestra iv-ensol-nosql
CouchDB Presentation
Apache CouchDB
REST Web Services com Java
noSQL com CouchDb e PHP
No sql Orientado a documento
Conhecendo Apache Cassandra @Movile
Web Scale Data Management
Apresentação MongoDB
NOSQL uma breve introdução
Artigo couchdb
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
MAC5855 - NoSQL
DBA Brasil 2.0 NOSql Apache Cassandra para DBAs
Interoperabilidade entre bancos de dados
Cassandra NoSQL JUG Vale 2012
Desenvolvimento web - conceitos, tecnologia e tendências.
Performance e disponibilidade ‐ Um estudo de caso: website dos Correios
Desenvolvimento web em java com JSP e Servlets
Anúncio

Destaque (18)

PPTX
MongoDB - Iniciando e Conhecendo
PPTX
Workshop MongoDB
KEY
MongoDB - Apresentação
KEY
NoSQL e MongoDB - ETEC
PDF
MongoDB: introdução à sua próxima base de dados
KEY
NoSQL e MongoDB
PPT
Palestra MongoDB
PDF
Minicurso Epoca mongoDB
PDF
Mini-Curso de MongoDB
ODP
MongoDB - Tudo que você precisa saber - FGSL 2014
ODP
MongoDB - Tudo o que você precisa saber - FISL16
ODP
Persistência Poliglota, Big Data e NoSQL FISL 15
PPT
Comparação de desempenho entre SQL e NoSQL
PDF
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
PPTX
NoSQL, Base VS ACID e Teorema CAP
PPTX
Modelos NoSQL e a Persistência Poliglota
ODP
ODP
NoSQL - Por que e quando usar?
MongoDB - Iniciando e Conhecendo
Workshop MongoDB
MongoDB - Apresentação
NoSQL e MongoDB - ETEC
MongoDB: introdução à sua próxima base de dados
NoSQL e MongoDB
Palestra MongoDB
Minicurso Epoca mongoDB
Mini-Curso de MongoDB
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo o que você precisa saber - FISL16
Persistência Poliglota, Big Data e NoSQL FISL 15
Comparação de desempenho entre SQL e NoSQL
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
NoSQL, Base VS ACID e Teorema CAP
Modelos NoSQL e a Persistência Poliglota
NoSQL - Por que e quando usar?
Anúncio

Semelhante a Utilizando NoSQL no desenvolvimento de soluções inteligentes (20)

PPT
Desenvolvendo soluções com banco de dados não relacional - MongoDB
PPT
Mongo Db - PHP Day Workshop
KEY
MongoDB na Campus Party
KEY
Django e MongoDB - Python Brasil 7
KEY
Python e MongoDB - Ensol
PDF
NoSql e NewSql
PPTX
Introdução ao MongoDB (NoSQL)
PDF
Curso mongo db com php
PDF
Introdução ao no sql e mongodb
PDF
Python e bancos NoSQL
PPTX
#1 Introdução ao MongoDB
PDF
Mongo DB
PDF
Material Seminário NoSQL
PPTX
Seminário - NoSQL
PPTX
Mongo db
PPTX
Desenvolvimento de aplicações PHP com MongoDB
PPTX
Introdução ao NoSQL e modelagem de dados com MongoDB
PDF
MongoDB outras alternativas de persistência
PDF
Introducao aos Bancos de Dados Não-relacionais
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Mongo Db - PHP Day Workshop
MongoDB na Campus Party
Django e MongoDB - Python Brasil 7
Python e MongoDB - Ensol
NoSql e NewSql
Introdução ao MongoDB (NoSQL)
Curso mongo db com php
Introdução ao no sql e mongodb
Python e bancos NoSQL
#1 Introdução ao MongoDB
Mongo DB
Material Seminário NoSQL
Seminário - NoSQL
Mongo db
Desenvolvimento de aplicações PHP com MongoDB
Introdução ao NoSQL e modelagem de dados com MongoDB
MongoDB outras alternativas de persistência
Introducao aos Bancos de Dados Não-relacionais

Mais de Christiano Anderson (14)

PDF
Meetup MUG-RS KingHost
PDF
certificadoTDC2016Floripa
ODP
Mapeando a Terra com soluções livres e GeoDjango
ODP
Grafos - Uma abordagem divertida - Latinoware 2014
ODP
MongoDB Schema Design - Latinoware 2014
ODP
Big Data Latinoware 2014
ODP
Big Data - Conceitos Básicos
ODP
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
ODP
MongoDB - Tudo o que você precisa saber
ODP
Django - Muito além do básico
PDF
KEY
Python MongoDB no MongoSP
ODP
Python and MongoDB
Meetup MUG-RS KingHost
certificadoTDC2016Floripa
Mapeando a Terra com soluções livres e GeoDjango
Grafos - Uma abordagem divertida - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
Big Data Latinoware 2014
Big Data - Conceitos Básicos
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
MongoDB - Tudo o que você precisa saber
Django - Muito além do básico
Python MongoDB no MongoSP
Python and MongoDB

Último (19)

PPTX
ccursoammaiacursoammaiacursoammaia123456
PDF
Aula 9 - Funções 202yttvrcrg5-1.pptx.pdf
PPTX
3b - Bradesco Lean Agile Training Plan - Ritos Operacionais (1).pptx
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PPT
Conceitos básicos de Redes Neurais Artificiais
PDF
Visão geral da SAP, SAP01 Col18, Introdução sistema SAP,
PDF
Processamento da remessa no SAP ERP, SCM610 Col15
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
PDF
Jira Software projetos completos com scrum
PPTX
Tipos de servidor em redes de computador.pptx
PDF
Banco de Dados 2atualização de Banco de d
PDF
ASCENSÃO E QUEDA DO SOFTWARE LIVRE NO ESTADO BRASILEIRO
PPTX
Aula 7 - Listas em Python (Introdução à Ciencia da Computação)
PDF
Metodologia Scrumban-XP - Um Guia Rápido (MrSomebody19).pdf
PPT
Aula de Engenharia de Software principais caracteristicas
PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
PDF
Customizing básico em SAP Extended Warehouse Management, EWM110 Col26
PDF
SEMINÁRIO DE IHC - A interface Homem-Máquina
ccursoammaiacursoammaiacursoammaia123456
Aula 9 - Funções 202yttvrcrg5-1.pptx.pdf
3b - Bradesco Lean Agile Training Plan - Ritos Operacionais (1).pptx
Analise Estatica de Compiladores para criar uma nova LP
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Conceitos básicos de Redes Neurais Artificiais
Visão geral da SAP, SAP01 Col18, Introdução sistema SAP,
Processamento da remessa no SAP ERP, SCM610 Col15
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
Jira Software projetos completos com scrum
Tipos de servidor em redes de computador.pptx
Banco de Dados 2atualização de Banco de d
ASCENSÃO E QUEDA DO SOFTWARE LIVRE NO ESTADO BRASILEIRO
Aula 7 - Listas em Python (Introdução à Ciencia da Computação)
Metodologia Scrumban-XP - Um Guia Rápido (MrSomebody19).pdf
Aula de Engenharia de Software principais caracteristicas
Processos no SAP Extended Warehouse Management, EWM100 Col26
Customizing básico em SAP Extended Warehouse Management, EWM110 Col26
SEMINÁRIO DE IHC - A interface Homem-Máquina

Utilizando NoSQL no desenvolvimento de soluções inteligentes

  • 1. The Real-time Web Utilizando NoSQL para desenvolvimento de soluções inteligentes Christiano Anderson Nodeware Diretor de desenvolvimento http://www.nodeware.com.br Email: anderson@nodeware.com.br Twitter: @nodeware Twitter: @dump Blog: http://christiano.me
  • 2. Sobre o autor • Trabalha com software livre desde 1995; • Diretor de Desenvolvimento da Nodeware; • Ex-desenvolvedor do projeto GNU; • Trabalha com Python desde 2000; • Evangelista NoSQL, Django e Node.JS; • Colabora com equipe de tradução do MongoDB; • Fundador do MUG-SP; @dump
  • 3. Sobre a Nodeware • Empresa nova mas com profissionais que participaram do início da internet comercial do Brasil; • Foco em soluções emergentes, cloud, NoSQL, Node.JS e gestão de conteúdo (CMS); • Parceira 10gen e Amazon AWS; • Mais em http://www.nodeware.com.br @dump
  • 4. NoSQL? • O termo foi cunhado por Carlo Strozzi e reintroduzido por Eric Evans, como referência a um tipo de armazenamento de dados; • O uso recomendado é Not Only SQL e nunca deve ser usado como “Não-SQL” ou “Never SQL”; • O movimento NoSQL é distinto do modelo relacional, o termo NoREL também é bastante apropriado. @dump
  • 5. NoSQL? “Non-relational next generation operational datastores and databases” Dwight Merriman, CEO 10gen @dump
  • 6. NoSQL? “NoSQL is a movement promoting a loosely defined class of non-relational data stores that break with a long history of relational databases.These data stores may not require fixed table schemas, usually avoid join operations and typically scale horizontally. Academics and papers typically refer to these databases as structured storage.” Wikipedia @dump
  • 7. Por que NoSQL? • É uma questão de escolha, novos paradigmas (nem tão novos assim); • É uma questão de funcionalidades; • Performance e Escalabilidade; • Não é questão de “ódio ao modelo SQL”; @dump
  • 8. Por que NoSQL? • Para trabalhar com uma massa enorme de dados que... • ... crescem exponencialmente; • ... agregam muitos outros valores dinamicamente; • ... exigem um formato diferenciado de dados; • ... não exigem um banco relacional, mas podem trabalhar em conjunto com um. @dump
  • 9. Por que NoSQL? • Para trabalhar com uma massa enorme de dados que... • ... crescem exponencialmente; Enorme é bastante relativo • ... agregam muitos outros valores dinamicamente; • ... exigem um formato diferenciado de dados; • ... não exigem um banco relacional, mas podem trabalhar em conjunto com um. @dump
  • 11. Orientação a documentos • Dados estruturados de forma encadeada, podendo ser coleções, tags, metadatas, hierarquias de informações, etc. • Exemplo de documento: nome:”Christiano”,empresa:”Nodeware”,contatos: [{twitter:”@dump”},{email:”anderson@nodeware.com.br”}] • Bom para aplicações de conteúdo, blogs, análise estatísticas, etc. @dump
  • 13. Grafos? • Estrutura de nós, bordas e propriedades para representar dados; • Todo elemento possui um apontamento direto para outro elemento adjacente; • Bom para mídias sociais, determinar relacionamento entre dados e B.I.; @dump
  • 14. Chave/Valor (k/v) Amazon SimpleDB MemcacheDB Segue um modelo baseado em colunas, mas que não deixa de ser conceito chave/valor. @dump
  • 15. Chave/Valor (k/v) • Quase todos os bancos NoSQL possuem o conceito de chave/valor; • Conceito para armazenar dados sem precisar de uma modelagem pré-definida; • Os dados podem estar em colunas; • A persistência dos dados pode ser em memória ou em disco; @dump
  • 16. Qual é o melhor? @dump
  • 17. Resposta Depende do que você vai fazer! As vezes pode precisar de mais de uma ferramenta @dump
  • 18. Motivos para adotar NoSQL • Grande quantidade de dados; • Ótima performance de escrita; • Rápido acesso chave-valor; • Modelagem flexível; • Migração fácil de dados; • Fácil para manter e administrar; • Sem pontos únicos de falha; • Facilidade no desenvolvimento; @dump
  • 19. Por onde começar? • Primeiro passo é saber o que você precisa; • MongoDB possui uma baixa curva de aprendizado, ótimo para conhecer os conceitos NoSQL; • MongoDB é o canivete suíço dos bancos NoSQL; @dump
  • 20. MongoDB? • Dois motivos para começar com MongoDB: • Baixa curva de aprendizado; • Agilidade no desenvolvimento; @dump
  • 21. Você deve considerar o uso de MongoDB se... • Você está usando muito cache em sua aplicação; • Você está armazenando muitos dados em arquivos estáticos; • Você precisa de processamento em tempo real; • Você gosta de desenvolvimento ágil (SCRUM); • Você tem dificuldades para modelar sua estrutura de dados no conceito relacional; • Seu projeto faz muita gravação e leitura em banco de dados; @dump
  • 22. O MongoDB substitui o banco relacional? • Como já foi explicado, é uma questão de escolha; • Uma aplicação pode usar banco relacional e NoSQL sem problema; @dump
  • 23. Desenvolvimento • O MongoDB e outros bancos NoSQL suportam praticamente todas as linguagens de programação; • O MongoDB possui suporte oficial para: • C, C++, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, .NET, Ruby, Scala, Go Language, Node.js, Lisp, Lua, Smalltalk... • Mais em: http://www.mongodb.org/display/DOCS/ Drivers @dump
  • 24. Modelo de Documento Um modelo de documento MongoDB possui o seguinte formato: {‘nome’:‘Christiano’, ‘linguagem’:‘node.js’, ‘nota’: 10} Sim, é praticamente um JSON @dump
  • 25. Comparando com SQL SQL MongoDB INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1}) SELECT a,b FROM users db.users.find({}, {a: 1, b: 1}) SELECT * FROM users db.users.find() SELECT * FROM users WHERE age=33 db.users.find({age: 33}) SELECT * FROm users WHERE name = “pedro” db.users.find({name:”pedro”}) @dump
  • 26. Comparando com SQL SQL MongoDB SELECT * FROM users WHERE db.users.find({‘age’:33}).sort({name: age=33 ORDER BY name 1}) SELECT * FROM users WHERE age db.users.find({‘age’:{$lt:33}})}) < 33 CREATE INDEX myindexname ON db.users.ensureIndex({name:1}) user(name) SELECT * FROM users WHERE a = 1 AND b = ‘q’ db.users.find({a:1, b:’q’}) SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20) @dump
  • 27. Índices • Possui suporte a índices para ganho de performance; • O conceito é similar a bancos relacionais, como MySQL; • Exemplo: • db.colecao.ensureIndex({nome:1}) • Mais: http://www.mongodb.org/display/DOCS/ Indexes @dump
  • 28. Replica Sets • Possível dividir a carga em vários servidores, replicando seu conteúdo via Replica Sets; • Possível crescer o ambiente de forma bastante orgânica; • Replica Set consiste em um ou mais node que replicam seus valores entre si. Server 1 Server 2 Somente leitura Leitura, Escrita Primário Cliente @dump
  • 29. Sharding • MongoDB escala horizontalmente via auto- sharding, particionando pedaço de dados entre servidores; • Pode adicionar novos nodes facilmente sem interromper o sistema; • Possível escalar centenas e milhares de servidores; • Não tem ponto único de falha; • Failover automático; @dump
  • 30. Python e MongoDB • Pymongo é o módulo que permite a conexão de qualquer aplicativo em Python ao MongoDB; • Instalado facilmente via pip ou easy_install: • pip install pymongo @dump
  • 31. Código de exemplo >>> from pymongo import Connection >>> con = Connection(“localhost”) >>> db = con[‘blog’] @dump
  • 32. Inserindo um documento >>> post = {'title':'My first post', …'author': 'Christiano Anderson', …'content': 'This is my first paragraph', … 'tags': ['mongodb','blog','example']} >>> posts = db['posts'] >>> posts.insert(post) ObjectId('4cb662f508bf532b1b000000') @dump
  • 33. Inserindo vários documentos >>> other_posts = [{'title':'Second Post', 'author': 'Christiano Anderson','tags':['test'], 'content': 'Hey, my second Post'}, {'title':'Third Post', 'author':'Luke Skywalker','tags': ['naboo'],'content':'Hey princess Leya'}] >>> posts.insert(other_posts) [ObjectId('4cb6651b08bf532b97000000'), ObjectId('4cb6651b08bf532b97000001')] @dump
  • 34. Realizando pesquisas >>> my_post = db.posts.find_one({}) {u'content': u'This is my first post at MongoDB', u'title': u'My first post', u'_id': ObjectId('4cb662f508bf532b1b000000'), u'tags': [u'mongodb', u'blog', u'example'], u'author': u'Christiano Anderson'} >>> my_post = db.posts.find_one({ 'author': 'Christiano Anderson'}) @dump
  • 35. Operadores • Também é possível utilizar operadores como $ne, $lte, $gte,entre outros... • Mais: http://www.mongodb.org/display/DOCS/ Advanced+Queries @dump
  • 36. Consultas à base >>> all_posts = db.posts.find({}) >>> for p in all_posts: ... print p['title'] My first post Second Post Third Post @dump
  • 37. Filtros como parâmetros >>> p = db.posts.find_one({'tags':'naboo'}) {u'content': u'Hey princess Leya', u'title': u'Third Post', u'_id': ObjectId('4cb6651b08bf532b97000001'), u'tags': [u'naboo'], u'author': u'Luke Skywalker'} @dump
  • 38. Map/Reduce • Utilizado para criar funções de pesquisa e agregadores no MongoDB; • Utiliza-se JavaScript; • Pode ser comparado a um Stored Procedure; @dump
  • 39. Exemplo de Map/Reduce function() { this.tags.forEach(function(z)) { emit(z, 1); });} function(key, value) { var total = 0; for(var i = 0; i < values.length; i++) { total += values[i]; } return total; } @dump
  • 40. Falando um pouco de Riak @dump
  • 41. Riak • Implementado a partir de papers do Amazon DynamoDB; • Escrito em Erlang; • Seu modelo é baseado em chave/valor (kv); • Muito, mas muito fácil para escalar; • Riak-search oferece busca estilo Solr/ Lucene; @dump
  • 42. Buckets • Buckets são utilizadas para definir um espaço virtual de dados; • Podem ser comparadas a pastas ou tabelas, em sistemas operacionais ou banco de dados relacionais respectivamente; • Essa é a única maneira de armazenar dados no Riak; @dump
  • 43. Riak - Exemplos em Python import riak client = riak.RiakClient() bucket = client.bucket('nodeware') p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', 'empresa': 'Nodeware', 'email': ‘anderson@nodeware.com.br’, }) p.store() @dump
  • 44. Riak - Exemplos em Python import riak Definição de Bucket client = riak.RiakClient() bucket = client.bucket('nodeware') p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', 'empresa': 'Nodeware', 'email': ‘anderson@nodeware.com.br’, }) p.store() @dump
  • 45. Riak - Exemplos em Python import riak Definição de Bucket client = riak.RiakClient() bucket = client.bucket('nodeware') p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', Dados 'empresa': 'Nodeware', 'email': ‘anderson@nodeware.com.br’, }) p.store() @dump
  • 46. Riak - Consultas ao banco import riak client = riak.RiakClient() bucket = client.bucket('nodeware') u = bucket.get('anderson') print u.get_data() {u'idade': 33, u'empresa': u'Nodeware 3', u'nome': u'Christiano Anderson'} @dump
  • 47. Outros bancos... • Eu gostaria de falar mais dos outros bancos, mas o tempo já acabou :-( @dump
  • 48. Fique informado • http://nosql.mypopescu.com/ • http://nosql-database.org/ • http://christiano.me/ • Twitter: @dump @al3xandru @dump
  • 49. Agora é sua vez!!! Christiano Anderson Mail: anderson@nodeware.com.br Site: http://www.nodeware.com.br Blog: http://christiano.me Twitter: @dump @dump

Notas do Editor