• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 

Utilizando NoSQL no desenvolvimento de soluções inteligentes

on

  • 3,426 views

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

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

Statistics

Views

Total Views
3,426
Views on SlideShare
2,163
Embed Views
1,263

Actions

Likes
3
Downloads
84
Comments
0

4 Embeds 1,263

http://christiano.me 1090
http://www.nodeware.com.br 171
https://twitter.com 1
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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 Utilizando NoSQL no desenvolvimento de soluções inteligentes Presentation Transcript

  • 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
  • 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
  • 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
  • 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
  • NoSQL?“Non-relational next generation operational datastores and databases” Dwight Merriman, CEO 10gen @dump
  • 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
  • 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
  • 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
  • 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
  • Orientação a documentos@dump
  • 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
  • GrafosTwitter FlockDB@dump
  • 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
  • Chave/Valor (k/v)Amazon SimpleDB MemcacheDB Segue um modelo baseado em colunas, mas que não deixa de ser conceito chave/valor. @dump
  • 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
  • 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;• Modelagem flexível;• Migração fácil de dados;• Fácil para manter e administrar;• Sem pontos únicos de falha;• Facilidade no desenvolvimento; @dump
  • 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
  • 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 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
  • 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
  • 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
  • Modelo de DocumentoUm modelo de documento MongoDB possui o seguinte formato: {‘nome’:‘Christiano’, ‘linguagem’:‘node.js’, ‘nota’: 10} Sim, é praticamente um JSON @dump
  • 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
  • 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
  • Í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
  • 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
  • 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
  • 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
  • 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, … tags:[mongodb,blog,example]}>>> posts = db[posts]>>> posts.insert(post)ObjectId(4cb662f508bf532b1b000000) @dump
  • 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
  • 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
  • Operadores• Também é possível utilizar operadores como $ne, $lte, $gte,entre outros...• Mais: http://www.mongodb.org/display/DOCS/ Advanced+Queries @dump
  • Consultas à base>>> all_posts = db.posts.find({})>>> for p in all_posts:... print p[title]My first post Second Post Third Post @dump
  • 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
  • Map/Reduce• Utilizado para criar funções de pesquisa e agregadores no MongoDB;• Utiliza-se JavaScript;• Pode ser comparado a um Stored Procedure; @dump
  • 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
  • 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);• Muito, mas muito fácil para escalar;• Riak-search oferece busca estilo Solr/ Lucene; @dump
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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 @dump
  • Agora é sua vez!!! Christiano AndersonMail: anderson@nodeware.com.brSite: http://www.nodeware.com.brBlog: http://christiano.meTwitter: @dump@dump