O documento apresenta os bancos de dados NoSQL, discutindo o que são, exemplos como CouchDB, MongoDB e Redis, e demonstrando códigos de exemplo para cada um utilizando Python. O palestrante é apresentado como desenvolvedor Python experiente e especialista em bancos de dados NoSQL.
3. Quem é o palestrante
É pragmático
Desenvolvedor há 14 anos
Autônomo, consultor e desenvolvedor
Co-fundador da comunidade Django brasileira
Autor do Geraldo Reports
Programador Python do Ano em 2009
Estudando Automação Industrial
5. O que é NoSQL?
Também chamados de MRMM e schemaless
Documentos, key/value, objetos, XML
Oferecem vantagens para escalar horizontalmente
Não possuem modelo rígido
Evita todo tipo normalização
Evita transações ACID (atomicidade, consistência,
isolamento e durabilidade)
Alguns suportam conexão assíncrona e REST
Muito utilizados como apoio a RDBMS
Melhor adaptados à nuvem
6. Alguns bancos NoSQL
CouchDB Google BigTable
MongoDB Amazon SimpleDB
Redis Db4o
MemcacheDB Caché
Tokyo Cabinet Hbase
HyperTable etc.
ZoDB
8. CouchDB
Parte da Apache Foundation
Suporta conexões assíncronas e REST
Escrito em Erlang
Armazena documentos JSON independentes
Um dos mais elegantes, mas ainda é lento
Suporta requisições HTTP e JavaScript
Replicação consistente
Adotado pelo Ubuntu 9.10
9. Exemplo: create, update e FK
Exemplo de código que cria um documento, atualiza e faz um
relacionamento
# -*- coding: utf-8 -*-
from couchdb.client import Server
conexao = Server('http://localhost:5984')
db = conexao['palestra']
marinho_id = db.create({'nome': u'Marinho', 'idade': 28})
marinho = db[marinho_id]
leticia_id = db.create({'nome': 'Leticia', 'idade': 29,
'esposo': marinho_id})
leticia = db[leticia_id]
marinho['esposa'] = leticia_id
db[marinho_id] = marinho
print db[leticia_id], db[marinho_id]
10. Exemplo: Pseudo-Modelos
from couchdb.client import Server, PreconditionFailed
from couchdb.schema import Document, TextField, IntegerField, ListField
conexao = Server('http://localhost:5984')
try:
db = conexao.create('palestra')
except PreconditionFailed:
del conexao['palestra']; db = conexao.create('palestra')
class Pessoa(Document):
nome = TextField()
idade = IntegerField()
filhos = ListField(TextField)
tarsila = Pessoa(nome='Tarsila', idade=4, id='1'); tarsila.store(db)
linus = Pessoa(nome='Linus', idade=0, id='2'); linus.store(db)
marinho = Pessoa(nome=u'Marinho', idade=28, filhos=[tarsila.id, linus.id])
marinho.store(db)
leticia = Pessoa(nome=u'Leticia', idade=29, filhos=[tarsila, linus])
leticia.store(db)
for obj_id in db: print db[obj_id]['nome']
12. MongoDB
Escrito em C
Possui uma camada na memória antes de
persistir
Boa performance
Armazena BSON em namespaces
Não suporta conexões assíncronas
Suporta REST
Bom suporte a sharding e replicação
13. Exemplo: removendo, criando, carregando
Exemplo de remoção de namespace, criação e carregamento
de documentos com referencia a outro documento.
# -*- coding: utf-8 -*-
from pymongo.connection import Connection
conexao = Connection(host='localhost', port=27017)
ns = conexao.palestra.pessoas
ns.remove()
mar_id = ns.save({'nome': u'Marinho', 'idade': 28})
mar = ns.find_one({'_id': mar_id})
let_id = ns.save({'nome': 'Leticia', 'idade': 29, 'esposo': mar_id})
let = ns.find_one({'_id': let_id})
for p in ns.find():
e = 'esposo' in p and ns.find_one({'_id': p['esposo']}) or None
print 'Nome:', p['nome'], e and 'Esposo(a): ' + e['nome'] or ''
15. Redis
Escrito em C
Trabalha como uma camada de cache em
memória, mas mantém persistência em disco
Armazena valores com tipagem estática
Performance excelente
Quase nenhum recurso para cálculos
Bom suporte a sharding e replicação
16. Exemplo: registros persistentes ou que expiram
Exemplo de funcionalidades básicas do Redis, incluindo
registros que expiram
# -*- coding: utf-8 -*-
import redis, time
con = redis.Redis('localhost', db=1)
mar_id = '00001'; let_id = '00002'
print 'nAntes:', 'nt', con.get(mar_id), 'nt', con.get(let_id)
con.set(mar_id, {'nome': u'Marinho', 'idade': 28})
con.set(let_id, {'nome': 'Leticia', 'idade': 29, 'esposo': mar_id})
con.expire(let_id, 5) # segundos para expirar
print 'nGravou:', 'nt', con.get(mar_id), 'nt', con.get(let_id)
time.sleep(7)
print 'nExpirou:', 'nt', con.get(mar_id), 'nt', con.get(let_id)
con.disconnect()