MongoDB vantagens e desvantagens

Banco de dados

Antes de falarmos sobre as vantagens e desvantagens do MongoDB, é importante saber o que é o MongoDB, e obter uma compreensão básica de suas características e funcionamento. Se você ainda não sabe o que é o MongoDB, talvez seja melhor começar com esse post: MongoDB para iniciantes – Introdução ao MongoDB, depois você volta aqui.

O que é Mongo DB?

Mas de forma muito breve, o MongoDB é um banco de dados de código aberto que utiliza um esquema de armazenamento de dados que pode ser personalizado (mais sobre isso no post).

Foi lançado em 2007, e hoje é um dos banco de dados não relacional mais populares, ele foi construído pensando em escalabilidade, máxima disponibilidade e bom desempenho, e se encontra atualmente (2022) na versão 5.0.

E qual a diferença entre base de dados relacional e não relacional? Um banco de dados NoSQL armazena dados de forma diferente dos bancos de dados relacionais; em vez de armazenar dados em tabelas de linhas e colunas, todos os registros em bancos de dados MongoDB são documentos definidos em uma representação binária de dados chamada BSON. Esta informação é recuperada por aplicativos em formato JSON.

NoSQL significa ‘Não apenas SQL’, e há muitos tipos nele, como colunas, documentos, gráficos, pares de valores chave, etc.; MongoDB é do tipo de documento como mencionado acima.

Em bancos de dados relacionais, os desenvolvedores precisam traduzir tabelas para o modelo de objeto para torná-las adequadas para uso no aplicativo; entretanto com MongoDB, tanto os dados armazenados quanto o modelo de objeto são da mesma estrutura BSON.

Vantagens

Maior flexibilidade com documentos

Como citado antes MongoDB utliza documentos como base de armazenamento de dados, isso permite que praticamente qualquer estrutura de dados possa ser modelada e manipulada facilmente. O formato de dados BSON do MongoDB, inspirado no JSON, permite que você tenha objetos em uma coleção com diferentes conjuntos de campos , por exemplo, se um usuário é casado, devemos também guardar o nome do cônjuge, se o usuário é solteiro, esse campo simplesmente não precisa existir.

MongoDB collection

Esta flexibilidade é uma vantagem incrível ao lidar com dados do mundo real e mudanças nas exigências ou no regras do negócio.

Amplamente suportado e acesso nativo em código

A maioria dos bancos de dados nos força a usar frameworks, wrappers ou ferramentas pesadas, como ORMs (Object-Relational Mappers), para obter dados na forma de Objetos para uso em programas.

Com a decisão do MongoDB de armazenar e representar dados em um formato de documento significa que você pode acessá-los de qualquer linguagem, em estruturas de dados nativas dessa linguagem (por exemplo, dicionários em Python, objetos em JavaScript, Maps em Java, etc).

No entanto, você vai sim precisar de um driver (Uma biblioteca que cria uma conexão entre sua aplicação e o banco de dados MongoDB), você pode conferir a lista com todos os MongoDB drivers nesse link.

Nesse exemplo abaixo, podemos ver como você poderia fazer para conectar e salvar novos registros em um banco de dados MongoDB usando PHP.

<?php

$cliente = new MongoDB\Client("mongodb://localhost:27017");
$colecao = $cliente->demo->alunos;

$resultado = $colecao->insertOne( [ 'name' => 'Gustavo', 'turma' => '9A' ] );
echo "Novo aluno ID: '{$resultado->getInsertedId()}'";

$resultado = $colecao->insertOne( [ 'name' => 'Tomas', 'turma' => '9C', 'turno' => 'diurno' ] );
echo "Novo aluno ID: '{$resultado->getInsertedId()}'";
?>

No exemplo, eu abro uma conexão com o banco de dados chamado demo e procuro pela coleção alunos, nessa coleção eu insiro dois novos registros, e como você pode notar o registro 2 tem parâmetros diferentes se comparado ao registro 1, o que é algo totalmente aceitável com MongoDB.

Alto desempenho

Graças ao modelo de documento utilizado no MongoDB, as informações podem ser incorporadas dentro de um único documento em vez de depender de operações JOIN dos bancos de dados relacionais tradicionais.

Por exemplo, no modelo tradicional de banco de dados, teríamos uma tabela para os nossos clientes, e uma tabela separada com os endereços desses clientes.

É claro que conseguimos reproduzir facilmente esse mesmo modelo em MongoDB simplesmente criando duas coleções, uma para os clientes e uma para os endereços. E para criar a referência entre os documentos cada endereço teria um parâmetro que seria responsável por fazer o link, nesse caso o cliente_id.

// documento do cliente
{
   _id: "72c4hxrt",
   nome: "Joe Bookreader"
}

// documentos dos endereços
{
   cliente_id: "72c4hxrt", // referencia ao documento do cliente
   rua: "123 Rua dos anjos",
   cidade: "São Paulo",
   estado: "SP",
   codigo_postal: "200128-120"
}

{
   cliente_id: "72c4hxrt",
   rua: "1 Rua Oliveira ",
   cidade: "Salvador",
   estado: "BA",
   codigo_postal: "291021-122"
}

Com MongoDB podemos simplificar e unir toda a informação em apenas um documento de forma bem mais simples utilizando o padrão de documento agregado (Embedded Document Pattern), nesse caso, agregar os endereços do cliente no documento do cliente, é o que faz mais sentido.

// documento do cliente
{
   _id: "72c4hxrt",
   nome: "Joe Bookreader",
   enderecos: [
      {
         rua: "123 Rua dos anjos",
         cidade: "São Paulo",
         estado: "SP",
         codigo_postal: "200128-120"
      },
      {
         rua: "1 Rua Oliveira ",
         cidade: "Salvador",
         estado: "BA",
         codigo_postal: "291021-122"
      }
   ] 
}

Isto torna as consultas muito mais rápidas e retorna todas as informações necessárias em uma única chamada para o banco de dados, veja como ficaria o novo documento agregando os endereços.

Quando se trata de desempenho de escrita, o MongoDB oferece funcionalidades para inserir e atualizar vários registros de uma só vez com o insertMany e o updateMany. Estas duas funções oferecem um aumento significativo de desempenho quando comparadas a gravações em lotes em bancos de dados tradicionais.

Para o nosso exemplo, onde criamos dois registros de alunos em duas chamadas distintas do método insertOne, poderíamos ter escrito utilizando o método insertMany como você pode ver abaixo.

<?php

$cliente = new MongoDB\Client("mongodb://localhost:27017");
$colecao = $cliente->demo->alunos;

$resultado = $colecao->insertMany( 
            [ 'name' => 'Gustavo', 'turma' => '9A' ], 
            [ 'name' => 'Tomas', 'turma' => '9C', 'turno' => 'diurno' ] 
);
?>

Outra grande vantagem do MongoDB, é que ele armazena a maior parte dos dados na RAM ao invés do disco rígido o que permite um desempenho mais rápido durante a execução de consultas. Para o garantir um processamento mais rápido, certifique-se de que seus índices cabem inteiramente na RAM para que o sistema possa evitar a leitura do índice a partir do disco.

MongoDB suporta transactions

Um banco de dados transacional é um banco de dados que suporta transações ACID (atomicidade, consistência, isolamento e durabilidade). Uma transação é um conjunto de operações de leitura e escrita de banco de dados onde todas ou nenhuma das operações são bem sucedidas.

As operações com um único documento sempre foram atômicas em MongoDB. O MongoDB adicionou suporte para ACID transactions multi-documento na versão 4.0, e expandiu esse suporte para incluir transações distribuídas na versão 4.2.

As garantias fornecidas pela MongoDB garantem o isolamento completo enquanto um documento é atualizado; qualquer erro faz com que a operação seja revertida retornando o documento inalterado.

Com a modelagem adequada as transações que incluem vários registros nem sempre são necessárias. Os dados em MongoDB, como vimos anteriormente, podem ser relacionados e modelados em uma única estrutura de dados, usando uma variedade de tipos, incluindo sub-documentos e arrays, fazendo isso, os usuários de MongoDB conseguem as mesmas garantias de integridade de dados que as fornecidas pelas bases de dados relacionais.

Estrutura amigável à mudanças

Se você está acostumado a ter que derrubar seu site ou aplicação para mudar a estrutura de dados, você está com sorte: MongoDB foi projetado para mudanças.

Ao contrário dos bancos de dados SQL, onde você deve determinar e declarar o esquema de uma tabela antes de inserir dados, as coleções do MongoDB, por padrão, não exigem que seus documentos tenham o mesmo esquema.

Isso significa que não há tempo de inatividade para mudar os esquemas, você pode começar a escrever novos dados com estruturas diferentes a qualquer momento, sem interromper suas operações.

Esta flexibilidade facilita o mapeamento de documentos para uma entidade ou objeto. Cada documento pode ser mapeado com os campos de um Objeto, mesmo que o documento tenha uma variação substancial em relação a outros documentos da coleção.

Na prática, porém, os documentos de uma coleção compartilham uma estrutura semelhante, e é possível aplicar regras de validação de documentos para uma coleção durante as operações de atualização e inserção.

Desvantagens

Assim como qualquer software, MongoDB também tem suas desvantagens. A sua grande maioria na verdade, são limitações que podem ser futuramente corrigidas ou melhoradas, mas no momento (2022), alguns dos pontos que vou citar abaixo poder vir a um problema para quem está pensando em usar MongoDB.

Tamanho do documento BSON

O tamanho máximo do documento BSON é de 16 megabytes.

O tamanho máximo do documento ajuda a garantir que um único documento não possa usar uma quantidade excessiva de RAM ou, durante a transmissão, uma quantidade excessiva de largura de banda. Para armazenar documentos maiores do que o tamanho máximo, o MongoDB fornece o GridFS API.

Limite de aninhamento em documentos BSON

MongoDB suporta não mais de 100 níveis de aninhamento para documentos BSON. Cada objeto ou matriz adiciona um nível.

Para exemplificar essa limitação:

{
  "_id": 1,
  "Universo": {
    "Virgo Cluster": [
      {
        "Virgo Supercluster": {
          "Local Group": {
            "Milky Way": {
              "Solar System": [
                {
                  "Earth": [
                    { "Asia": ["Countries", "..."], "Europe": ["Countries", ".."], "America": ["Countries", "..."] }
                  ]
                }
              ]
            }
          }
        }
      },
      { "Laniakea Supercluster": "..." }
    ]
  }
}

Operações de ordenação com limites

Se MongoDB não puder usar um índice ou índices para ordenar os campos de um documento, MongoDB inicia uma operação de ordenação com bloqueio de dados (blocking data sort).

O nome refere-se a um processo SORT onde todos os documentos de uma coleção são lidos para retornar um documento de saída, nesse caso o fluxo de dados para aquela consulta específica deve ser bloqueada.

Se MongoDB exigir o uso de mais de 100 megabytes de memória do sistema para a operação de ordenação, MongoDB retorna um erro a menos que a consulta especifique cursor.allowDiskUse() (Novo no MongoDB 4.4).

allowDiskUse() permite que MongoDB use arquivos temporários em disco para armazenar dados que excedam o limite de 100 megabytes de memória durante o processamento de uma operação de ordenação.

db.COLLECTION_NAME.find().sort({KEY:1})

MongoDB Principais Termos/Conceitos

SQL Termos/ConceitosMongoDB Termos/Conceitos
banco de dadosbanco de dados
tabelacoleção
linhadocumento ou BSON documento
colunacampo
indexindex
chave_primaria
Especifica uma coluna única ou combinação de colunas como chave primária.
chave_primaria
Em MongoDB, a chave primária é automaticamente definida para o campo _id.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

1 Comments

Eduarda

ótimo artigo! obrigada, me ajudou muito