Objetivos de aprendizado
Depois de ler este artigo, você vai conseguir:
- Entender o que muda entre bancos SQL e NoSQL
- Comparar esquema, relações, transações e escala lado a lado
- Escolher entre SQL e NoSQL para o seu bot, API ou site
Nesta página
"SQL ou NoSQL" parece uma escolha entre dois produtos, mas não é. SQL é uma linguagem de consulta e, por extensão, o modelo relacional por trás dela. NoSQL é um guarda-chuva para tudo que não segue esse modelo: bancos de documentos, chave-valor, colunares, de grafos. Comparar os dois é comparar formas de organizar dados.
A decisão importa porque trocar de banco depois custa caro: você reescreve consultas, migra dados e refaz testes. Por isso vale escolher pelo formato dos seus dados e pela forma como você os acessa, não pela moda.
O que é um banco SQL?#
Um banco SQL (relacional) guarda dados em tabelas de linhas e colunas. Você define o esquema antes: nomes das colunas, tipos e restrições. As tabelas se ligam por chaves estrangeiras, e a consulta cruza tudo com JOIN.
Exemplos comuns são PostgreSQL, MySQL e SQLite. A promessa central é a integridade: o banco recusa um pedido que aponte para um usuário inexistente, e uma transação garante que um conjunto de gravações acontece por inteiro ou não acontece.
O que é um banco NoSQL?#
"NoSQL" não descreve um modelo, descreve uma ausência. Os tipos mais usados por quem hospeda bots, APIs e sites são:
- Documentos (MongoDB): objetos parecidos com JSON, agrupados em collections. Cada documento pode ter listas e objetos aninhados.
- Chave-valor e estruturas em memória (Redis): acesso por chave, com tipos como strings, hashes, listas, sets e sorted sets, segundo a documentação do Redis.
- Colunares e de grafos: para análise em larga escala e redes de relações. Ficam fora do escopo da maioria dos projetos pequenos.
O que une esses bancos é a escolha de abrir mão de parte do modelo relacional em troca de outra vantagem: formato flexível, acesso direto por chave ou facilidade de distribuir dados entre servidores.
Qual a diferença entre SQL e NoSQL, lado a lado?#
| Critério | SQL (PostgreSQL, MySQL) | NoSQL (MongoDB, Redis) |
|---|---|---|
| Modelo | Tabelas, linhas, colunas | Documentos, chave-valor e outros |
| Esquema | Definido antes, imposto pelo banco | Flexível; validação opcional |
| Relações | Chaves estrangeiras e JOIN |
Dados embutidos no documento ou referências feitas pela aplicação |
| Consulta | SQL padrão | API ou linguagem própria de cada banco |
| Transações | Completas, o centro do modelo | Variam: MongoDB suporta multi-documento; Redis tem garantias próprias |
| Melhor acesso | Consultas variadas e cruzamento de dados | Leitura e gravação do objeto inteiro, ou busca por chave |
A tabela é uma tendência, não uma lei. O PostgreSQL guarda JSON com o tipo jsonb, e o MongoDB tem transações e validação de esquema. As fronteiras se misturam, por isso o critério certo é o seu padrão de acesso, não o rótulo.
Como o mesmo dado fica em cada modelo?#
Pegue um pedido com itens. No modelo relacional, ele se divide em tabelas:
CREATE TABLE pedidos (
id serial PRIMARY KEY,
usuario_id integer NOT NULL,
criado_em timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE itens_pedido (
pedido_id integer NOT NULL REFERENCES pedidos (id),
produto text NOT NULL,
quantidade integer NOT NULL CHECK (quantidade > 0),
PRIMARY KEY (pedido_id, produto)
);
SELECT p.id, i.produto, i.quantidade
FROM pedidos p
JOIN itens_pedido i ON i.pedido_id = p.id
WHERE p.usuario_id = 42;No modelo de documentos, o mesmo pedido vira um objeto só, com os itens dentro (exemplo no mongosh):
db.pedidos.insertOne({
usuarioId: 42,
criadoEm: new Date(),
itens: [
{ produto: "Camiseta", quantidade: 2 },
{ produto: "Caneca", quantidade: 1 },
],
});
db.pedidos.find({ usuarioId: 42 });Ler o pedido completo é uma operação só, sem junção. O preço aparece quando o mesmo dado é consultado por outro ângulo, por exemplo "quais pedidos contêm Caneca": no modelo relacional isso é um índice e um JOIN, e no modelo de documentos você depende de um índice sobre o campo aninhado e de manter os dados consistentes na aplicação.
Quando as transações decidem a escolha?#
Transferir saldo entre duas contas só pode acontecer por inteiro. Em SQL isso é natural:
BEGIN;
UPDATE contas SET saldo = saldo - 100 WHERE id = 1;
UPDATE contas SET saldo = saldo + 100 WHERE id = 2;
COMMIT;No PostgreSQL, o nível de isolamento padrão é o Read Committed, e é possível subir para Repeatable Read ou Serializable quando a lógica exigir, segundo a documentação.
O MongoDB suporta transações entre vários documentos, mas a documentação avisa que elas costumam custar mais que gravações em um documento só e recomenda embutir os dados como primeira opção de modelagem.
A regra prática: se o seu domínio vive de transações entre muitas entidades (saldos, estoque, pagamentos), o modelo relacional é o ajuste natural. Se cada operação mexe num objeto só, o modelo de documentos serve bem.
E o esquema flexível, é vantagem ou risco?#
Num banco de documentos, a collection aceita documentos com campos diferentes. Isso acelera o início do projeto e ajuda com dados heterogêneos, como catálogos em que cada produto tem atributos próprios. A documentação do MongoDB descreve esse modelo flexível e a validação de esquema para quando você quiser travar o formato.
O risco é o esquema implícito: sem regras, cada versão do código grava de um jeito e a leitura precisa tratar todas as variações. Num banco relacional, a migração é mais trabalhosa, mas o banco garante que todo registro obedece à estrutura. O meio-termo existe: o PostgreSQL combina colunas fixas com um campo jsonb indexável, o que cobre muitos casos "meio flexíveis" sem trocar de banco.
Como escolher entre SQL e NoSQL?#
Faça quatro perguntas:
- Os dados têm relações fortes entre si? Usuários, pedidos, assinaturas e inventário apontam uns para os outros. SQL.
- Você lê e grava o objeto inteiro de uma vez? Configuração por servidor de Discord, perfil com campos opcionais. Documentos funcionam bem, e o PostgreSQL com
jsonbtambém. - O acesso é por chave, e perder o dado é tolerável? Cache, sessão, cooldown, rate limit. Redis. Ele pode gravar em disco (veja a documentação de persistência), mas foi pensado para dados que cabem na memória.
- O formato muda toda semana? Num protótipo, a flexibilidade ajuda. Em produção, avalie quanto vale impor estrutura.
Sem uma razão clara para o contrário, um banco relacional é o ponto de partida mais seguro. Para decidir dentro de cada família, veja qual banco de dados escolher, PostgreSQL ou MySQL e o que é MongoDB. Para o papel do Redis ao lado de outro banco, leia Redis como cache ou como banco.
Como fazer isso na Square Cloud#
A Square Cloud oferece hospedagem de MongoDB, PostgreSQL, MySQL e Redis, a partir do plano Standard. O plano Hobby não inclui hospedagem de bancos. Assim, você tem os dois lados da comparação: SQL com PostgreSQL ou MySQL, NoSQL com MongoDB ou Redis.
Você cria o banco no painel, e ele fica pronto em segundos no mesmo datacenter das suas aplicações, com latência média de cerca de 1 ms e TLS obrigatório. Combinar dois motores no mesmo projeto, como PostgreSQL para os dados permanentes e Redis para cache, é só criar os dois e guardar as URLs de conexão em variáveis de ambiente. O número de bancos só é limitado pela RAM do plano: cada um usa no mínimo 512 MB (Redis) ou 1024 MB (os outros).
Você tira snapshots manuais quando quiser, e todo plano com bancos inclui também um snapshot automático diário. Dá para restaurar um snapshot no mesmo banco, em outro do mesmo motor ou num banco novo. O Redis tem persistência, e o PostgreSQL é o nativo, sem extensões. Veja as opções em Bancos de dados.
Hospedagem de bancos
MongoDB, PostgreSQL, MySQL e Redis no mesmo datacenter do app
Perguntas frequentes
NoSQL é mais rápido que SQL?
Não existe um vencedor geral. Cada banco é rápido no acesso para o qual foi desenhado: buscar um documento inteiro ou um valor por chave favorece NoSQL, e consultas que cruzam várias tabelas favorecem SQL. Meça com os seus dados.
NoSQL não tem transações?
Depende do banco. O MongoDB, por exemplo, suporta transações entre vários documentos, embora a documentação recomende modelar para que uma gravação em um só documento baste. O Redis tem transações com MULTI/EXEC, mas sem rollback: se um comando falhar durante a execução, os outros da fila continuam.
Dá para usar SQL e NoSQL no mesmo projeto?
Dá, e é comum. Um desenho frequente guarda os dados permanentes num banco relacional e usa o Redis para cache, filas e contadores. Adicione o segundo banco só quando houver um problema concreto.
NoSQL significa sem esquema?
Em geral o esquema é flexível, não ausente. No MongoDB, documentos de uma collection não precisam ter os mesmos campos, mas você pode impor regras com validação de esquema JSON. O esquema passa a morar no banco ou no código, conforme você decidir.
Mais em Bancos de dados
Ver todos os 24 artigos- Quanto custa um banco de dados na nuvem?Um banco de dados na nuvem custa de zero a centenas de dólares por mês. Veja o que define o preço: instância, disco, tráfego, snapshots e como estimar o seu.
- Como hospedar um banco de dados (e conectar sua aplicação)Para hospedar um banco de dados, escolha o motor, crie a instância, guarde a string de conexão em variável de ambiente e teste a conexão. Veja o passo a passo.
- O que é Redis e para que serveRedis é um banco de dados em memória que guarda pares chave-valor e estruturas de dados. Veja como funciona, para que serve e quando não usar.
- Como fazer backup do banco de dados (MySQL, PostgreSQL, MongoDB)Faça backup de MySQL, PostgreSQL e MongoDB com mysqldump, pg_dump e mongodump, e restaure o dump. Veja os comandos, como verificar e os erros comuns.