MongoDB não é escalável?

Olá pessoal, gostaria de uma opinião sincera de vocês em relação ao MongoDB. Vejo muita gente falando mal por não ser um banco relacional, que por esse motivo, não pode ser escalável e etc... Por outro lado, vejo algumas pessoas falando que o problema não é banco de dados e sim quem o modela.

O que vocês acham?

Aí depende de o que você considera como escalável. Se você considera como escalável o fato de que você pode aumentar a máquina ou criar novos nós para distribuir o processamento, bancos de dados não relacionais são bem melhores para escalar, já que não possuem a quantidade de restrição que um banco de dados relacional, que geralmente necessita realizar apenas o escalonamento vertical (vide PS para mais informações).

Se você considera escalável o fato de performance de consultas, banco de dados relacional, por ter um desenvolvimento muito mais aprofundado (PostgreSQL tá em desenvolvimento ativo desde 1996 por exemplo) que bancos de dados não relacionais, também aparentam maior performance em geral em benchmarks, inclusive em consultas que o banco de dados não relacional deveria ser superior. Aqui tem uma talk dissertando mais sobre esse assunto. Além disso, banco de dados relacional tem a vantagem por causa que muitos deles utilizam SQL, que é uma linguagem padronizada, enquanto banco de dados não relacional não possuem uma padronização (cada banco de dados cria o seu próprio padrão).

Mas com certeza, um dos problemas é a modelagem de dados. O que eu mais vejo hoje em dia é desenvolvedor que não sabe modelar um banco de dados, se esquece ou até mesmo ignora as Formas Normais (no caso de banco relacional) ou simplesmente faz relações no código quando utiliza bancos de dados não relacionais.

Dev quer é entregar valor, e banco de dados em tese é "apenas um repositório de dados". Não é. Temos constraints, índices, alta disponibilidade, consultas geoespaciais, otimizações de consultas, funções, entre outras infinitas coisas, mas isso demanda muito estudo. Se tu simplesmente só jogar dado no banco, é óbvio que ele vai performar aquém do que você espera. Então é questão de conhecimento.

De qualquer forma, temos N bancos de dados, e se temos vários bancos de dados, é porque eles são usados em situações específicas, então não posso falar "ah, tem que usar sempre banco de dados relacional" ou "tem que usar não relacional", tudo depende da situação e o que o teu sistema vai fazer. Abaixo, minhas opiniões sobre situações e o que tu pode utilizar como banco (obviamente todos são open source ou possuem licenças permissivas):

  • Pesquisas geoespaciais: PostgreSQL (utilizando PostGIS) ou ElasticSearch
  • Armazenamento temporário de coisas (ex. dados de sessão, ou cache): Redis ou Aerospike
  • Pesquisas em geral: ElasticSearch
  • Data Warehouse: Apache Druid
  • Banco de dados embedded: SQLite
  • Armazenamento de documento: PostgreSQL ou Mongo
  • Metadados de serviços distribuídos: Zookeeper ou etcd
  • Time series: ElasticSearch ou TimeScale
  • Nenhuma coisa em específico: PostgreSQL

PS.: Apesar de eu citar sobre escalabilidade de banco de dados relacional geralmente somente pode escalar verticalmente, também há a categoria de bancos de dados relacionais distribuídos, como posso citar o [Spanner](https://en.wikipedia.org/wiki/Spanner_(database) e o YugabyteDB, sendo o Yugabyte open source.

Obviamente por ter mais tempo de mercado, os bancos relacionais tem mais sistemas anti-burro que o Mongo.

Então acaba sendo melhor os bancos relacionais, já que eles possuem mais recursos para lidar com uma modelagem ruim.

Mas obviamente não desejável modelagem ruim.