Upload
marinho-brandao
View
3.300
Download
1
Embed Size (px)
DESCRIPTION
Slides da palestra sobre Python com bancos de dados NoSQL no FLISOL de Goiânia, 2010
Citation preview
Python com bancos de dados NoSQL
Marinho Brandão, FLISOL 2010, Goiânia
Quem é o palestrante
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
O que é NoSQL?
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
Alguns bancos NoSQL
CouchDB MongoDB Redis MemcacheDB Tokyo Cabinet HyperTable ZoDB
Google BigTable Amazon SimpleDB Db4o Caché Hbase etc.
CouchDB
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
Exemplo: create, update e FK
# -*- 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_iddb[marinho_id] = marinho
print db[leticia_id], db[marinho_id]
Exemplo de código que cria um documento, atualiza e faz um relacionamento
Exemplo: Pseudo-Modelosfrom couchdb.client import Server, PreconditionFailedfrom 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']
MongoDB
s
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
# -*- 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 ''
Exemplo: removendo, criando, carregando
Exemplo de remoção de namespace, criação e carregamento de documentos com referencia a outro documento.
Redis
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
Exemplo: registros persistentes ou que expiram
# -*- coding: utf-8 -*-import redis, time
con = redis.Redis('localhost', db=1)
mar_id = '00001'; let_id = '00002'
print '\nAntes:', '\n\t', con.get(mar_id), '\n\t', 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:', '\n\t', con.get(mar_id), '\n\t', con.get(let_id)
time.sleep(7)
print '\nExpirou:', '\n\t', con.get(mar_id), '\n\t', con.get(let_id)
con.disconnect()
Exemplo de funcionalidades básicas do Redis, incluindo registros que expiram
Referências
http://en.wikipedia.org/wiki/NoSQL
http://couchdb.apache.org/
http://www.mongodb.org/
http://code.google.com/p/redis/
http://groups.google.com/group/MRNN-Brasil
http://nosql.mypopescu.com/post/276069660/nosql-libraries
http://labs.mudynamics.com/wp-content/uploads/2009/04/icouch.html
http://bret.appspot.com/entry/how-friendfeed-uses-mysql
http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-
migrated-from-mysql-to-mongodb/
http://code.google.com/p/redis/wiki/IntroductionToRedisDataTypes
http://escalabilidade.com/2010/03/08/introducao-ao-nosql-parte-i/
Perguntas?
Marinho Brandão
[email protected]://www.marinhobrandao.com
http://www.aprendendodjango.com