Skip to content

Latest commit

 

History

History
179 lines (177 loc) · 7.36 KB

5.2 MongoDB e NoSQL.md

File metadata and controls

179 lines (177 loc) · 7.36 KB

Introdução ao MongoDB e Banco de Dados NoSQL

  • 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

Introdução

  1. 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 de bancos de dados NoSQL

  1. 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.

  1. 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)

  1. 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

  1. 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! Patterns&UseDesigns

  1. 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

  1. 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

Alguns comandos na prática

  1. Manipulação de dados
  • Comandos principais
    • show databases - mostra a database
    • use db_name - usa o database db_name
    • db.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 dados
    • db.db_name.insert({...}, {...}) - Insere vários registros
    • db.db_name.save({...}) - Atualiza ou cria um registro
    • db.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 registro
    • db.db_name.updateMany({...} {...}}) - atualiza todos os registros que satisfação a condição
    • db.db_name.deleteOne({...}}) - deleta um sregistro
    • db.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

  1. 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

  1. 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