- Os bancos de dados não relacionais
- Hoje, existem vários bancos de dados não relacionais
- O MongoDB é um dos (se não o) mais utilizados no mundo
- Criação do NoSQL e bancos de dados não relacionais
- Timeline
- 1970 -
- 1998 - 1º NoSQL
- 2009 - Reaparição do termo em uma conferência
- NoSQL = Not Only SQL (?)
- Os bancos de dados não relacionais
- Diferenças em relação os BD relacionais
- Escalabilidade
- Facilidade de scale up e scale out
- Alta performance
- Schemas flexíveis (em detrimento da deterioração da performance, em caso de um planejamento falho da estrutura)
- Transações
BD Relacional BD Não Relacional Atomicidade Basically Available Consistência Soft-State Isolamento Eventually Consistent Durabilidade
- Tipos BDs NoSQL
- Ranking DB-Engines
- Tipos de bancos de dados NoSQL
- Orientado a documentos (p.ex. MongoDB)
- Key-value (p.ex. Redis)
- Orientado a colunas (p.ex. Cassandra)
- Orientado a grafos (p.ex. Neo4j)
- Orientação a grafos
- Estrutura composta por vértices ou nós e arestas ou relações
- Usado em detecção de fraudes, jogos, redes sociais, etc.
- P.ex. Neo4j
- http://sandbox.neo4j.com
- Usa a linguagem Cypher
- Criação de nós
CREATE (:Client {name: "Lula Molusco", age: 30, hobbies: ['Tocar clarinete']})
- Criando relações
MATCH (lula:Client {name: "Lula Molusco"}), (patrick: Client {name: "Patrick Estrela"}) CREATE (lula)-[:Bloqueado]->(patrick)
- Consultando nós MATCH (todos) RETURN todos
- Orientação a colunas/famílias
- Similar ao SQL, mas as colunas não são obrigatórias criadas para todas as linhas
- Ideal para matrizes esparsas, em que haveriam muitas células em branco num BD tradicional
- As colunas são reservadas apenas para as linhas que usam aquela informação
- Cada célula possui três valores - nome da coluna (key), valor da coluna na linha (value) e timestamp
- As consultas devem ser pela Primary Key, ou por outro valor indexado previamente
- Usual para casos em que o volume de consulta seja muito maior que a de escrita
- P.ex. Cassandra
- Orientação a chave e valor
- Bom desempenho em aplicações na nuvem
- Menor capacidade de busca, apenas pela chave
- Usos: cache, sessão de usuário, carrinhos de compra, mensageria, fila
- Similar ao Cassandra, que foi criado a partir de um BD NoSQL Key-Value
- Não há pré-definição de Schema
- P.ex. Redis
- Alto desempenho
- Estrutura de dados na memória
- Versatilidade
- Replicação e persistência
- http://try.redis.io
- Usado pelo Twitter, Linkedin, p.ex.
- Bancos de Dados orientados a Documentos
- Dados e documentos autocontidos e auto descritivos
- Permite redundância e inconsistência
- Livre de schemas, podendo usar JSON, XML, etc.
- Exemplo: MongoDB (será aprofundado a seguir)
- Introdução ao MongoDB
- Características
- Código aberto
- Alta performance
- Schema-free
- Usa o JSON / BSON
- Suporte a índices
- Auto-sharding: Escalamento horizontal
- Map-Reduce
- GridFS
- Rica linguagem de consulta
- Conceitos
- Documento ==> Tupla/Registro
- Collections ==> Tabela
- Embedding/linking ==> Join (Não é o uso ideal)
- Quando usar:
- Grande volumes de dados não necessariamente estruturados
- Não necessita de scripts prévios para criar os schemas
- Entidades com atributos desconhecidos previamente ou muito variáveis
- Quando não usar:
- Necessidade de relacionamentos/joins
- Propriedades ACID e transações sejam importantes
- Diversas entidades de pagamentos não homologam sistemas cujos dados financeiros não estejam em bancos de dados relacionais tradicionais
- MongoDB Cloud
- Schema Design
- Embedding ou Referência
- Embedding
- Documentos autocontidos
- Informações em única query
- Atualiza registro em uma única operação
- Limite de 16MB/doc
- Referência
- Dependância de outros documentos
- Documentos pequenos
- Não duplica informações
- Usado quando dados não são acessados em todas as consultas
- Isso porque haverá consulta múltipla com maior tempo
- Duas ou mais queries ou uso do $lookup
- Recomendação conforme o tipo de relacionamento
- One-to-few: prefira embedding
- One-to-many ou Many-to-many: prefira referência
- Nem sempre o uso de dados não normalizados é prejudicial - depende de cada caso!
- Boas práticas com MongoDB
- Evite documentos muito grandes
- Use nomes de campos objetivos e curtos
- Analise as suas queries com o explain() e o MongoCompass (principalmente queries mais complexas e em campos não indexados)
- Atualize apenas os campos alterados
- Evite negações em queries
- Lista e Arrays devem ser limitadas
- Leia a documentação
- BSON x JSON
- O MongoDB usa o BSON e não o JSON
- BSON é a serialização codificada em binário de documentos semelhantes ao JSON
- Contém extensões que representam tipos de dados como Date e ObjectID, que não
- Manipulação de dados
- Comandos principais
show databases
- mostra a databaseuse db_name
- usa o database db_namedb.createCollection("db_name", {capped: true, max: 2, size: 2})
- cria uma collection com as opções inseridas- A criação não precisa ser explícita sempre!
db.db_name.inserOne({"name": "Teste1})
- insere um registro no banco de dadosdb.db_name.insert({...}, {...})
- Insere vários registrosdb.db_name.save({...})
- Atualiza ou cria um registrodb.db_name.find({...})
- Procura os registros 'test' com as condições indicadas- Podem ser passados vários parâmetros para delimitar a query
db.db_name.update({...})
- atualiza um registrodb.db_name.updateMany({...} {...}})
- atualiza todos os registros que satisfação a condiçãodb.db_name.deleteOne({...}})
- deleta um sregistrodb.db_name.deleteOne({...}})
- deleta todos os registros que satisfaçam a condição
- Operadores:
- $set
- $in
- $or
- $lt
- $ne (cuidado)
- ...
- Se preciso, leia a documentação
- Performance e Índices
- Índice no NoSQL é similar ao SQ
- Índices são usados para prevenir o collection scan, isto é, que a query exija uma consulta a toda a collection
- Nos inserts, o mongoDB já cria o campo
_id
e indexa essa campo - Outros índices podem ser criados com o comando
db.collection_name.createIndex()
- A diferença de performance é brutal! Sempre que possível use indíces nas consultas frequentes
- Agregações
- Procedimento de processar dadps em uma ou mais etapas para retornar um resultado combinado
- Agregações podem ser:
- de pipeline, customizáveis; ou
- de propósito único, não customizáveis (count e distinct)
- Agregações de pipelines usam operadores como $group e $addField
db.collection('collectionName').aggregate([...])
- Funções - $sum, $avg, $max, $min, $match