O documento apresenta uma palestra sobre NoSQL e bancos de dados não relacionais. Em três frases: (1) Discutiu os tipos de bancos NoSQL orientados a documentos, grafos e chave-valor; (2) Explicou como o MongoDB pode ser usado para substituir ou trabalhar com bancos relacionais; (3) Apresentou exemplos de desenvolvimento com MongoDB e Riak usando a linguagem Python.
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
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
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
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
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
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
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
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
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