The Real-time Web        Utilizando NoSQL para         desenvolvimento de         soluções inteligentesChristiano Anderson...
Sobre o autor•   Trabalha com software livre desde 1995;•   Diretor de Desenvolvimento da Nodeware;•   Ex-desenvolvedor do...
Sobre a Nodeware•   Empresa nova mas com profissionais que    participaram do início da internet comercial do    Brasil;•  ...
NoSQL?•   O termo foi cunhado por Carlo Strozzi e    reintroduzido por Eric Evans, como referência a    um tipo de armazen...
NoSQL?“Non-relational next generation operational       datastores and databases”                        Dwight Merriman, ...
NoSQL?“NoSQL is a movement promoting a loosely defined class of non-relational data stores that break with a long history o...
Por que NoSQL?• É uma questão de escolha, novos  paradigmas (nem tão novos assim);• É uma questão de funcionalidades;• Per...
Por que NoSQL?•   Para trabalhar com uma massa enorme de dados    que...    •   ... crescem exponencialmente;    •   ... a...
Por que NoSQL?•   Para trabalhar com uma massa enorme de dados    que...    •   ... crescem exponencialmente;        Enorm...
Orientação a documentos@dump
Orientação a documentos•   Dados estruturados de forma encadeada, podendo    ser coleções, tags, metadatas, hierarquias de...
GrafosTwitter FlockDB@dump
Grafos?• Estrutura de nós, bordas e propriedades  para representar dados;• Todo elemento possui um apontamento  direto par...
Chave/Valor (k/v)Amazon SimpleDB       MemcacheDB                      Segue um modelo baseado em                      col...
Chave/Valor (k/v)• Quase todos os bancos NoSQL possuem o  conceito de chave/valor;• Conceito para armazenar dados sem  pre...
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;•  ...
Por onde começar?• Primeiro passo é saber o que você precisa;• MongoDB possui uma baixa curva de  aprendizado, ótimo para ...
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 mui...
O MongoDB substitui o banco relacional?• Como já foi explicado, é uma questão de  escolha;• Uma aplicação pode usar banco ...
Desenvolvimento•   O MongoDB e outros bancos NoSQL suportam    praticamente todas as linguagens de programação;•   O Mongo...
Modelo de DocumentoUm modelo de documento MongoDB possui          o seguinte formato:     {‘nome’:‘Christiano’,     ‘lingu...
Comparando com SQL               SQL                              MongoDBINSERT INTO USERS VALUES(1,1)                db.u...
Comparando com SQL               SQL                                MongoDB  SELECT * FROM users WHERE               db.us...
Índices•   Possui suporte a índices para ganho de    performance;•   O conceito é similar a bancos relacionais, como    My...
Replica Sets•   Possível dividir a carga em vários servidores, replicando seu conteúdo via    Replica Sets;•   Possível cr...
Sharding•   MongoDB escala horizontalmente via auto-    sharding, particionando pedaço de dados entre    servidores;•   Po...
Python e MongoDB•   Pymongo é o módulo que permite a conexão de    qualquer aplicativo em Python ao MongoDB;•   Instalado ...
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 firstparagraph, … ...
Inserindo vários documentos>>> other_posts = [{title:Second Post, author: ChristianoAnderson,tags:[test], content: Hey, my...
Realizando pesquisas>>> my_post = db.posts.find_one({}){ucontent: uThis is my first post atMongoDB, utitle: uMy first post...
Operadores•   Também é possível utilizar operadores como $ne,    $lte, $gte,entre outros...•   Mais: http://www.mongodb.or...
Consultas à base>>> all_posts = db.posts.find({})>>> for p in all_posts:... print p[title]My first post Second Post Third ...
Filtros como parâmetros>>> p = db.posts.find_one({tags:naboo}){ucontent: uHey princess Leya, utitle:uThird Post, u_id:Obje...
Map/Reduce• Utilizado para criar funções de pesquisa e  agregadores no MongoDB;• Utiliza-se JavaScript;• Pode ser comparad...
Exemplo de Map/Reducefunction() {     this.tags.forEach(function(z)) {         emit(z, 1);});}function(key, value) {    va...
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);•...
Buckets• Buckets são utilizadas para definir um  espaço virtual de dados;• Podem ser comparadas a pastas ou tabelas,  em si...
Riak - Exemplos em Pythonimport riakclient = riak.RiakClient()bucket = client.bucket(nodeware)p = bucket.new(anderson, dat...
Riak - Exemplos em Pythonimport riak                          Definição de Bucketclient = riak.RiakClient()bucket = client....
Riak - Exemplos em Pythonimport riak                          Definição de Bucketclient = riak.RiakClient()bucket = client....
Riak - Consultas ao bancoimport riakclient = riak.RiakClient()bucket = client.bucket(nodeware)u = bucket.get(anderson)prin...
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...
Agora é sua vez!!!        Christiano AndersonMail: anderson@nodeware.com.brSite: http://www.nodeware.com.brBlog: http://ch...
Upcoming SlideShare
Loading in...5
×

Utilizando NoSQL no desenvolvimento de soluções inteligentes

4,049

Published on

Apresentação do FISL sobre banco de dados não relacionais, FISL13

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,049
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
109
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Utilizando NoSQL no desenvolvimento de soluções inteligentes

    1. 1. The Real-time Web Utilizando NoSQL para desenvolvimento de soluções inteligentesChristiano Anderson NodewareDiretor de desenvolvimento http://www.nodeware.com.brEmail: anderson@nodeware.com.br Twitter: @nodewareTwitter: @dumpBlog: http://christiano.me
    2. 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. 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. 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. 5. NoSQL?“Non-relational next generation operational datastores and databases” Dwight Merriman, CEO 10gen @dump
    6. 6. NoSQL?“NoSQL is a movement promoting a loosely defined class of non-relational data stores that break with a long history ofrelational 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. 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. 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. 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
    10. 10. Orientação a documentos@dump
    11. 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
    12. 12. GrafosTwitter FlockDB@dump
    13. 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. 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. 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. 16. Qual é o melhor?@dump
    17. 17. Resposta Depende do que você vai fazer!As vezes pode precisar de mais de uma ferramenta@dump
    18. 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. 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. 20. MongoDB?• Dois motivos para começar com MongoDB: • Baixa curva de aprendizado; • Agilidade no desenvolvimento; @dump
    21. 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. 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. 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. 24. Modelo de DocumentoUm modelo de documento MongoDB possui o seguinte formato: {‘nome’:‘Christiano’, ‘linguagem’:‘node.js’, ‘nota’: 10} Sim, é praticamente um JSON @dump
    25. 25. Comparando com SQL SQL MongoDBINSERT 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. 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}})}) < 33CREATE 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. 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. 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. 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. 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. 31. Código de exemplo>>> from pymongo import Connection>>> con = Connection(“localhost”)>>> db = con[‘blog’] @dump
    32. 32. Inserindo um documento>>> post = {title:My first post,…author: Christiano Anderson,…content: This is my firstparagraph, … tags:[mongodb,blog,example]}>>> posts = db[posts]>>> posts.insert(post)ObjectId(4cb662f508bf532b1b000000) @dump
    33. 33. Inserindo vários documentos>>> other_posts = [{title:Second Post, author: ChristianoAnderson,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. 34. Realizando pesquisas>>> my_post = db.posts.find_one({}){ucontent: uThis is my first post atMongoDB, utitle: uMy first post, u_id:ObjectId(4cb662f508bf532b1b000000), utags:[umongodb, ublog, uexample], uauthor:uChristiano Anderson}>>> my_post = db.posts.find_one({ author:Christiano Anderson}) @dump
    35. 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. 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. 37. Filtros como parâmetros>>> p = db.posts.find_one({tags:naboo}){ucontent: uHey princess Leya, utitle:uThird Post, u_id:ObjectId(4cb6651b08bf532b97000001),utags: [unaboo], uauthor: uLukeSkywalker} @dump
    38. 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. 39. Exemplo de Map/Reducefunction() { 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. 40. Falando um pouco de Riak @dump
    41. 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. 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. 43. Riak - Exemplos em Pythonimport riakclient = 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. 44. Riak - Exemplos em Pythonimport riak Definição de Bucketclient = 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. 45. Riak - Exemplos em Pythonimport riak Definição de Bucketclient = 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. 46. Riak - Consultas ao bancoimport riakclient = riak.RiakClient()bucket = client.bucket(nodeware)u = bucket.get(anderson)print u.get_data() {uidade: 33, uempresa: uNodeware 3, unome: uChristiano Anderson} @dump
    47. 47. Outros bancos...• Eu gostaria de falar mais dos outros bancos, mas o tempo já acabou :-( @dump
    48. 48. Fique informado• http://nosql.mypopescu.com/• http://nosql-database.org/• http://christiano.me/• Twitter: @dump @al3xandru @dump
    49. 49. Agora é sua vez!!! Christiano AndersonMail: anderson@nodeware.com.brSite: http://www.nodeware.com.brBlog: http://christiano.meTwitter: @dump@dump
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×