SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
the real time web




NoSQL para soluções inteligentes


                   Christiano Anderson
                   diretor de desenvolvimento

                   anderson@nodeware.com.br
                   Twitter: @dump / @nodeware
                   Blog: http://christiano.me
Sobre o palestrante
● Trabalha com software livre desde 1995;
● Sócio fundador 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
Twitter: @dump
Sobre a Nodeware




● Empresa nova, mas com corpo técnico atuante
  desde o início da internet comercial no Brasil;
● Foco em soluções emergentes, nuvem, NoSQL,
  Node.JS, georreferenciamento e CMS;
● Parceira 10gen, Amazon AWS;
● Conheça mais em http://www.nodeware.com.br
Twitter: @dump
NoSQL???? WTF?
● Termo criado por Carlo Strozzi
  e 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 NonREL também é bastante apropriado nessa
  definição;



Twitter: @dump
NoSQL?


        "Non-relational next generation
     operational datastores anda databases"

                  Dwight Merriman
                    CEO - 10gen




Twitter: @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


Twitter: @dump
Por que usar NoSQL?


● É uma questão de escolhas e novos paradigmas
     (na verdade, nem tão novos assim);
● É uma questão de funcionalidades;
● É uma questão de performance e escalabilidade;
● Não tem nada relacionado ao ódio ao modelo
     SQL;
Twitter: @dump
Para que usar NoSQL?
● Para trabalhar com quantidade enorme de
  dados que...                        sim, enorme é
                                      muito relativo
     ○    ... crescem exponencialmente;
     ○    ... agregam muitos outros valores dinamicamente;
     ○    ... não necessitam de modelagem de dados;
     ○    ... não possuem dependência a bancos relacionais, mas
          podem trabalhar em conjunto com um;




Twitter: @dump
Tipos de Bancos Não Relacionais




Twitter: @dump
Orientação a documentos
● Os dados são estruturados de forma encadeada,
  podendo ser coleções, tags, metadados,
  hierarquias de informações, etc;
● Bom para aplicações de conteúdo, gerenciar
  logs, análise estatísticas, etc;
● Exemplo de documento:
       {'nome':'Christiano','evento':'Campus Party'}




Twitter: @dump
Bancos orientados a documento




                           Entre outros....



Twitter: @dump
Grafos




Twitter: @dump
Grafos
● Estrutura de nós, bordas e propriedades para
  representar e associar hierarquia de dados;
● Todo elemento possui um apontamento direto
  para outro elemento adjacente;
● Excelente para mídias sociais, determinar
  relacionamento entre dados, BI, etc;




Twitter: @dump
Exemplos de bancos orientados a Grafos




Twitter: @dump
Chave/Valor




Twitter: @dump
Chave/Valor (K/V)
● Quase todos os bancos não relacionais possuem
  um pouco de conceito chave/valor;
● Conceito é utilizado para armazenar dados que
  não necessitam de uma modelagem prévia;
● Os dados podem também estar em colunas;
● A persistência dos dados pode estar em disco ou
  memória RAM;
● A Escalabilidade de bancos orientados a K/V
  costuma ser bem simples e eficiente;


Twitter: @dump
Exemplos de bancos Chave/Valor




                         MemcacheDB

                       Amazon SimpleDB




Twitter: @dump
São muitas opções, qual deles é melhor?




Twitter: @dump
Qual das ferramenta abaixo é a melhor?




Twitter: @dump
Resposta
Depende do que você vai fazer. As vezes pode ser
necessário usar mais de uma ferramenta!




Twitter: @dump
Motivos para considerar o uso de NoSQL
●    Se possui enorme quantidade de dados;
●    Se precisa de performance na escrita;
●    Se precisa escalar com facilidade;
●    Se não precisa trabalhar com modelo SQL;
●    Se a modelagem pode ser flexível;
●    Para migrar dados facilmente;
●    Se deseja facilidade de administrar;
●    Pode ser usado na nuvem;
●    Se deseja não ter um ponto único de falha;
●    Se busca agilidade no desenvolvimento...
Twitter: @dump
E por onde eu começo?
● O primeiro passo é avaliar uma solução e suas
  necessidades e dependências;
● O MongoDB pode ser um ótimo começo, sua
  curva de aprendizado é baixa e o banco é muito
  flexível;
● Conheça todas as features do MongoDB antes
  de fazer o plano de projeto;
● Escolha uma boa linguagem de programação.
  Python, Java, Node.JS, Ruby e PHP são ótimas
  escolhas para qualquer projeto.
Twitter: @dump
Do que você deve fugir
● Nunca, mas nunca pense em modelagem
  relacional enquanto estiver trabalhando com
  NoSQL, você poderá engessar sua aplicação!
● O código não pode ficar amarrado a uma
  modelagem, deve ser o mais flexível possível;
● Basicamente fugindo dessas duas ciladas, a
  chance de sucesso é grande.




Twitter: @dump
Falando de MongoDB, considere se...
● Você está usando muito cache em sua aplicação;
● Muitos arquivos estáticos estão sendo
  armazenados na sua aplicação;
● Se necessita de processamento em tempo real;
● Se você gosta de desenvolvimento ágil
  (SCRUM);
● Se tem dificuldade para modelar sua aplicação
  no modelo convencional relacional;
● Se faz muita leitura/gravação de dados;


Twitter: @dump
O MongoDB substitui o banco relacional?

● Pode substituir, mas como já foi explicado, é
     uma questão de escolha;
● Uma aplicação pode usar MongoDB em
     conjunto com um banco relacional sem
     nenhum problema. Tudo vai depender da sua
     aplicação;


Twitter: @dump
Novidades do MongoDB

● A próxima versão (2.3.4) terá suporte a busca
     textual;
● Suporte a stemming, negação, aproximação,
     busca por frases, suporte a prefixos e sufixos;
● É uma novidade muito esperada e reforça o
     MongoDB como uma solução completa de
     NoSQL;
Twitter: @dump
Full Text Search: Stopwords

"Eu sou seu pai, Luke"
Palavras que importam na busca: "pai, Luke"
eu, sou, seu = stopwords




Twitter: @dump
Full Text Search: Stemming

O Stemming identifica e considera a raiz de uma
palavra na busca para torna-la mais precisa;
     "fazendo, feito, fazer, faz"




Twitter: @dump
Full Text Search - Mais exemplos e como fazer

Bons exemplos de como fazer busca textual no
MongoDB, por enquanto, disponível apenas na
versão em desenvolvimento:

                 bit.ly/12cABWs




Twitter: @dump
Plataformas de desenvolvimento
● O MongoDB e outros bancos NoSQL suportam
  praticamente todas as linguagens de
  programação;
● Oficialmente, o MongoDB suporta linguagens
  como:
     ○ C, C++, Erlang, Haskell, Java, JavaScript, Python, PHP,
        Perl, .NET, Ruby, Scala, Go Language, Node.JS, LISP, Lua,
        SmallTalk...
●    Mais em http://www.mongodb.
     org/display/DOCS/Drivers


Twitter: @dump
Modelo de documento
A base de um documento MongoDB consiste em:

                 {'nome':'Christiano',
                 'sobrenome':'Anderson',
                 'email':'anderson@nodeware.com.br',
                 'nota': 10}


                               Sim, é praticamente um json!




Twitter: @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 =   db.users.find({name:”pedro”})
      “pedro”



Twitter: @dump
Comparando com SQL 2
                      SQL                                    MongoDB
         SELECT * FROM users WHERE age=33            db.users.find({‘age’:33}).sort
     ORDER BY name
                                                 ({name:1})

          SELECT * FROM users WHERE age < 33         db.users.find({‘age’:{$lt:33}})})


         CREATE INDEX myindexname ON user            db.users.ensureIndex({name:1})
     (name)


           SELECT * FROM users WHERE a = 1 AND       db.users.find({a:1, b:’q’})
     b = ‘q’

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


Twitter: @dump
Replica sets
● Facilidade em espelhar o banco em vários
  servidores;
● Possibilita crescer o ambiente de forma
  orgânica;
● Replica sets consiste em dois ou mais nós que
  replicam dados entre si, semelhante ao MySQL
  cluster (conceito de master, slaves);




Twitter: @dump
Sharding
● Sharding é um conceito usado para "fatiar"
  dados entre vários servidores, exemplo:
     ○ Servidor 1 possui usuários da letra A até a letra F;
     ○ Servidor 2 possui usuários da letra G até a letra L;
     ○ Servidor 3 possui usuáriso da letra M até a letra Z;
● É possível adicionar novos nodes facilmente
  sem parar o sistema;
● Possível escalar centenas de servidores nesse
  layout;
● Não possui ponto único de falha e faz failover
  automático;
Twitter: @dump
Desenvolvendo com MongoDB
● Como já foi explicado, o MongoDB possui
  suporte para quase todas as linguagens de
  programação;
● Desenvolver utilizando um modelo NoSQL é
  um novo paradigma e atribui mais poder ao
  programador;
● Os exemplos a seguir serão demonstrados em
  Python;



Twitter: @dump
Pymongo
● Módulo responsável pela conexão ao MongoDB;

● Pode ser instalado facilmente:

     ○ pip install pymongo

● Possui uma ótima documentação e é muito

     estável.


Twitter: @dump
Estabelecendo uma conexão
>>> from pymongo import Connection

>>> con = Connection("localhost")

>>> db = con['blog']




Twitter: @dump
Inserindo um documento
>>> post = {'title':'Meu primeiro post',
            'author':'Christiano Anderson',
            'contents':'Aqui vem o corpo do post',
            'tags':['mongodb','blog','examples']}

>>> posts = db['posts']
>>> posts.insert(post)
ObjectId('4cb662f508bf532b1b000000')


Twitter: @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')]




Twitter: @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'})




Twitter: @dump
Listando todos os documentos


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

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




Twitter: @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'}




Twitter: @dump
Operadores
● Também é possível utilizar operadores como
  filtro de busca, exemplo:
     ○    $ne
     ○    $lte, $gte
     ○    $and
     ○    $in, $nin
     ○    $size
     ○    $or, $nor, etc
● Lista completa em http://www.mongodb.
     org/display/DOCS/Advanced+Queries




Twitter: @dump
Map/Reduce
● O MongoDB suporta nativamente Map Reduce;
● Utiliza JavaScript como linguagem;
● Serve para buscar, processar e extrair
     resultados em um conjunto grande de dados;




Twitter: @dump
Exemplo de map reduce no MongoDB
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;
}

Twitter: @dump
Falando um pouco de Riak




Twitter: @dump
Introdução
● Implementado pela Basho, seguindo os papers
     do Amazon DynamoDB;
● Escrito em Erlang;
● Altamente escalável;
● Modelo baseado em Chave/Valor (K/V);
● É possível plugar busca textual no estilo
     Sorl/Lucene;
Twitter: @dump
Buckets
● Riak utiliza conceito de "buckets" para

     armazenar dados;

● Podem ser comparados a pastas ou tabelas;




Twitter: @dump
Exemplo Python e Riak
import riak

client = riak.RiakClient()

bucket = client.bucket('pessoas')

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




Twitter: @dump
Riak - Consulta ao banco
import riak

client = riak.RiakClient()
bucket = client.bucket('pessoas')
u = bucket.get('anderson')
print u.get_data()

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




Twitter: @dump
Outros bancos
Eu gostaria de falar de outros bancos, mas o tempo
acabou! :-(




Twitter: @dump
Boas fontes de informação

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

Twitter: @dump
Perguntas?




Twitter: @dump
Obrigado!!!!
  Se não deu tempo de responder sua dúvida durante a
  palestra, me pare no corredor ou entre em contato:


                 Christiano Anderson
                 anderson@nodeware.com.br
                 http://christiano.me
                 @dump


Twitter: @dump

Mais conteúdo relacionado

Semelhante a Palestra nosql

Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
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
 
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
 
Banco de Dados NoSQL - Disciplina: Sistemas Distribuídos
Banco de Dados NoSQL - Disciplina: Sistemas DistribuídosBanco de Dados NoSQL - Disciplina: Sistemas Distribuídos
Banco de Dados NoSQL - Disciplina: Sistemas DistribuídosJoão Helis Bernardo
 
NoSQL, MongoDB e MEAN
NoSQL, MongoDB e MEANNoSQL, MongoDB e MEAN
NoSQL, MongoDB e MEANOsmar Petry
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open sourceRodrigo Aurélio
 
MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberChristiano Anderson
 
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
 
Arquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarArquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarBetter Developer
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDBLelyBarros
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à práticaMario Guedes
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2Flávio Lisboa
 

Semelhante a Palestra nosql (20)

SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
 
NoSql e NewSql
NoSql e NewSqlNoSql e NewSql
NoSql e NewSql
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
#1 Introdução ao MongoDB
#1   Introdução ao MongoDB#1   Introdução ao MongoDB
#1 Introdução ao MongoDB
 
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
 
Bancos de dados NoSQL
Bancos de dados NoSQLBancos de dados NoSQL
Bancos de dados NoSQL
 
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
 
Banco de Dados NoSQL - Disciplina: Sistemas Distribuídos
Banco de Dados NoSQL - Disciplina: Sistemas DistribuídosBanco de Dados NoSQL - Disciplina: Sistemas Distribuídos
Banco de Dados NoSQL - Disciplina: Sistemas Distribuídos
 
MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
NoSQL, MongoDB e MEAN
NoSQL, MongoDB e MEANNoSQL, MongoDB e MEAN
NoSQL, MongoDB e MEAN
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open source
 
MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saber
 
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
 
Arquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarArquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudar
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
 
Big data da teoria à prática
Big data  da teoria à práticaBig data  da teoria à prática
Big data da teoria à prática
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
 
NoSQL com Zend Framework 2
NoSQL com Zend Framework 2NoSQL com Zend Framework 2
NoSQL com Zend Framework 2
 

Mais de Christiano Anderson

Mais de Christiano Anderson (14)

Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
certificadoTDC2016Floripa
certificadoTDC2016FloripacertificadoTDC2016Floripa
certificadoTDC2016Floripa
 
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
 
Mapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoMapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjango
 
Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
Big Data Latinoware 2014
Big Data Latinoware 2014Big Data Latinoware 2014
Big Data Latinoware 2014
 
Big Data - Conceitos Básicos
Big Data - Conceitos BásicosBig Data - Conceitos Básicos
Big Data - Conceitos Básicos
 
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERIGeo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 
GeoDjango
GeoDjangoGeoDjango
GeoDjango
 
Scrum
ScrumScrum
Scrum
 
Python MongoDB no MongoSP
Python MongoDB no MongoSPPython MongoDB no MongoSP
Python MongoDB no MongoSP
 
Python and MongoDB
Python and MongoDBPython and MongoDB
Python and MongoDB
 

Palestra nosql

  • 1. the real time web NoSQL para soluções inteligentes Christiano Anderson diretor de desenvolvimento anderson@nodeware.com.br Twitter: @dump / @nodeware Blog: http://christiano.me
  • 2. Sobre o palestrante ● Trabalha com software livre desde 1995; ● Sócio fundador 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 Twitter: @dump
  • 3. Sobre a Nodeware ● Empresa nova, mas com corpo técnico atuante desde o início da internet comercial no Brasil; ● Foco em soluções emergentes, nuvem, NoSQL, Node.JS, georreferenciamento e CMS; ● Parceira 10gen, Amazon AWS; ● Conheça mais em http://www.nodeware.com.br Twitter: @dump
  • 4. NoSQL???? WTF? ● Termo criado por Carlo Strozzi e 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 NonREL também é bastante apropriado nessa definição; Twitter: @dump
  • 5. NoSQL? "Non-relational next generation operational datastores anda databases" Dwight Merriman CEO - 10gen Twitter: @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 Twitter: @dump
  • 7. Por que usar NoSQL? ● É uma questão de escolhas e novos paradigmas (na verdade, nem tão novos assim); ● É uma questão de funcionalidades; ● É uma questão de performance e escalabilidade; ● Não tem nada relacionado ao ódio ao modelo SQL; Twitter: @dump
  • 8. Para que usar NoSQL? ● Para trabalhar com quantidade enorme de dados que... sim, enorme é muito relativo ○ ... crescem exponencialmente; ○ ... agregam muitos outros valores dinamicamente; ○ ... não necessitam de modelagem de dados; ○ ... não possuem dependência a bancos relacionais, mas podem trabalhar em conjunto com um; Twitter: @dump
  • 9. Tipos de Bancos Não Relacionais Twitter: @dump
  • 10. Orientação a documentos ● Os dados são estruturados de forma encadeada, podendo ser coleções, tags, metadados, hierarquias de informações, etc; ● Bom para aplicações de conteúdo, gerenciar logs, análise estatísticas, etc; ● Exemplo de documento: {'nome':'Christiano','evento':'Campus Party'} Twitter: @dump
  • 11. Bancos orientados a documento Entre outros.... Twitter: @dump
  • 13. Grafos ● Estrutura de nós, bordas e propriedades para representar e associar hierarquia de dados; ● Todo elemento possui um apontamento direto para outro elemento adjacente; ● Excelente para mídias sociais, determinar relacionamento entre dados, BI, etc; Twitter: @dump
  • 14. Exemplos de bancos orientados a Grafos Twitter: @dump
  • 16. Chave/Valor (K/V) ● Quase todos os bancos não relacionais possuem um pouco de conceito chave/valor; ● Conceito é utilizado para armazenar dados que não necessitam de uma modelagem prévia; ● Os dados podem também estar em colunas; ● A persistência dos dados pode estar em disco ou memória RAM; ● A Escalabilidade de bancos orientados a K/V costuma ser bem simples e eficiente; Twitter: @dump
  • 17. Exemplos de bancos Chave/Valor MemcacheDB Amazon SimpleDB Twitter: @dump
  • 18. São muitas opções, qual deles é melhor? Twitter: @dump
  • 19. Qual das ferramenta abaixo é a melhor? Twitter: @dump
  • 20. Resposta Depende do que você vai fazer. As vezes pode ser necessário usar mais de uma ferramenta! Twitter: @dump
  • 21. Motivos para considerar o uso de NoSQL ● Se possui enorme quantidade de dados; ● Se precisa de performance na escrita; ● Se precisa escalar com facilidade; ● Se não precisa trabalhar com modelo SQL; ● Se a modelagem pode ser flexível; ● Para migrar dados facilmente; ● Se deseja facilidade de administrar; ● Pode ser usado na nuvem; ● Se deseja não ter um ponto único de falha; ● Se busca agilidade no desenvolvimento... Twitter: @dump
  • 22. E por onde eu começo? ● O primeiro passo é avaliar uma solução e suas necessidades e dependências; ● O MongoDB pode ser um ótimo começo, sua curva de aprendizado é baixa e o banco é muito flexível; ● Conheça todas as features do MongoDB antes de fazer o plano de projeto; ● Escolha uma boa linguagem de programação. Python, Java, Node.JS, Ruby e PHP são ótimas escolhas para qualquer projeto. Twitter: @dump
  • 23. Do que você deve fugir ● Nunca, mas nunca pense em modelagem relacional enquanto estiver trabalhando com NoSQL, você poderá engessar sua aplicação! ● O código não pode ficar amarrado a uma modelagem, deve ser o mais flexível possível; ● Basicamente fugindo dessas duas ciladas, a chance de sucesso é grande. Twitter: @dump
  • 24. Falando de MongoDB, considere se... ● Você está usando muito cache em sua aplicação; ● Muitos arquivos estáticos estão sendo armazenados na sua aplicação; ● Se necessita de processamento em tempo real; ● Se você gosta de desenvolvimento ágil (SCRUM); ● Se tem dificuldade para modelar sua aplicação no modelo convencional relacional; ● Se faz muita leitura/gravação de dados; Twitter: @dump
  • 25. O MongoDB substitui o banco relacional? ● Pode substituir, mas como já foi explicado, é uma questão de escolha; ● Uma aplicação pode usar MongoDB em conjunto com um banco relacional sem nenhum problema. Tudo vai depender da sua aplicação; Twitter: @dump
  • 26. Novidades do MongoDB ● A próxima versão (2.3.4) terá suporte a busca textual; ● Suporte a stemming, negação, aproximação, busca por frases, suporte a prefixos e sufixos; ● É uma novidade muito esperada e reforça o MongoDB como uma solução completa de NoSQL; Twitter: @dump
  • 27. Full Text Search: Stopwords "Eu sou seu pai, Luke" Palavras que importam na busca: "pai, Luke" eu, sou, seu = stopwords Twitter: @dump
  • 28. Full Text Search: Stemming O Stemming identifica e considera a raiz de uma palavra na busca para torna-la mais precisa; "fazendo, feito, fazer, faz" Twitter: @dump
  • 29. Full Text Search - Mais exemplos e como fazer Bons exemplos de como fazer busca textual no MongoDB, por enquanto, disponível apenas na versão em desenvolvimento: bit.ly/12cABWs Twitter: @dump
  • 30. Plataformas de desenvolvimento ● O MongoDB e outros bancos NoSQL suportam praticamente todas as linguagens de programação; ● Oficialmente, o MongoDB suporta linguagens como: ○ C, C++, Erlang, Haskell, Java, JavaScript, Python, PHP, Perl, .NET, Ruby, Scala, Go Language, Node.JS, LISP, Lua, SmallTalk... ● Mais em http://www.mongodb. org/display/DOCS/Drivers Twitter: @dump
  • 31. Modelo de documento A base de um documento MongoDB consiste em: {'nome':'Christiano', 'sobrenome':'Anderson', 'email':'anderson@nodeware.com.br', 'nota': 10} Sim, é praticamente um json! Twitter: @dump
  • 32. 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 = db.users.find({name:”pedro”}) “pedro” Twitter: @dump
  • 33. Comparando com SQL 2 SQL MongoDB SELECT * FROM users WHERE age=33 db.users.find({‘age’:33}).sort ORDER BY name ({name:1}) SELECT * FROM users WHERE age < 33 db.users.find({‘age’:{$lt:33}})}) CREATE INDEX myindexname ON user db.users.ensureIndex({name:1}) (name) SELECT * FROM users WHERE a = 1 AND db.users.find({a:1, b:’q’}) b = ‘q’ SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20) Twitter: @dump
  • 34. Replica sets ● Facilidade em espelhar o banco em vários servidores; ● Possibilita crescer o ambiente de forma orgânica; ● Replica sets consiste em dois ou mais nós que replicam dados entre si, semelhante ao MySQL cluster (conceito de master, slaves); Twitter: @dump
  • 35. Sharding ● Sharding é um conceito usado para "fatiar" dados entre vários servidores, exemplo: ○ Servidor 1 possui usuários da letra A até a letra F; ○ Servidor 2 possui usuários da letra G até a letra L; ○ Servidor 3 possui usuáriso da letra M até a letra Z; ● É possível adicionar novos nodes facilmente sem parar o sistema; ● Possível escalar centenas de servidores nesse layout; ● Não possui ponto único de falha e faz failover automático; Twitter: @dump
  • 36. Desenvolvendo com MongoDB ● Como já foi explicado, o MongoDB possui suporte para quase todas as linguagens de programação; ● Desenvolver utilizando um modelo NoSQL é um novo paradigma e atribui mais poder ao programador; ● Os exemplos a seguir serão demonstrados em Python; Twitter: @dump
  • 37. Pymongo ● Módulo responsável pela conexão ao MongoDB; ● Pode ser instalado facilmente: ○ pip install pymongo ● Possui uma ótima documentação e é muito estável. Twitter: @dump
  • 38. Estabelecendo uma conexão >>> from pymongo import Connection >>> con = Connection("localhost") >>> db = con['blog'] Twitter: @dump
  • 39. Inserindo um documento >>> post = {'title':'Meu primeiro post', 'author':'Christiano Anderson', 'contents':'Aqui vem o corpo do post', 'tags':['mongodb','blog','examples']} >>> posts = db['posts'] >>> posts.insert(post) ObjectId('4cb662f508bf532b1b000000') Twitter: @dump
  • 40. 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')] Twitter: @dump
  • 41. 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'}) Twitter: @dump
  • 42. Listando todos os documentos >>> all_posts = db.posts.find({}) >>> for p in all_posts: ... print p['title'] My first post Second Post Third Post Twitter: @dump
  • 43. 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'} Twitter: @dump
  • 44. Operadores ● Também é possível utilizar operadores como filtro de busca, exemplo: ○ $ne ○ $lte, $gte ○ $and ○ $in, $nin ○ $size ○ $or, $nor, etc ● Lista completa em http://www.mongodb. org/display/DOCS/Advanced+Queries Twitter: @dump
  • 45. Map/Reduce ● O MongoDB suporta nativamente Map Reduce; ● Utiliza JavaScript como linguagem; ● Serve para buscar, processar e extrair resultados em um conjunto grande de dados; Twitter: @dump
  • 46. Exemplo de map reduce no MongoDB 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; } Twitter: @dump
  • 47. Falando um pouco de Riak Twitter: @dump
  • 48. Introdução ● Implementado pela Basho, seguindo os papers do Amazon DynamoDB; ● Escrito em Erlang; ● Altamente escalável; ● Modelo baseado em Chave/Valor (K/V); ● É possível plugar busca textual no estilo Sorl/Lucene; Twitter: @dump
  • 49. Buckets ● Riak utiliza conceito de "buckets" para armazenar dados; ● Podem ser comparados a pastas ou tabelas; Twitter: @dump
  • 50. Exemplo Python e Riak import riak client = riak.RiakClient() bucket = client.bucket('pessoas') p = bucket.new('anderson', data = { 'nome': 'Christiano Anderson', 'empresa': 'Nodeware', 'email': ‘anderson@nodeware.com.br’, }) p.store() Twitter: @dump
  • 51. Riak - Consulta ao banco import riak client = riak.RiakClient() bucket = client.bucket('pessoas') u = bucket.get('anderson') print u.get_data() {u'idade': 33, u'empresa': u'Nodeware 3', u'nome': u'Christiano Anderson'} Twitter: @dump
  • 52. Outros bancos Eu gostaria de falar de outros bancos, mas o tempo acabou! :-( Twitter: @dump
  • 53. Boas fontes de informação ● http://nosql.mypopescu.com/ ● http://nosql-database.org/ ● http://christiano.me ● @dump @al3xandru Twitter: @dump
  • 55. Obrigado!!!! Se não deu tempo de responder sua dúvida durante a palestra, me pare no corredor ou entre em contato: Christiano Anderson anderson@nodeware.com.br http://christiano.me @dump Twitter: @dump