SQL e NoSQL
Os modelos de dados disponíveis e os critérios para escolher o banco de um sistema.
Um modelo de dados é uma forma de pensar
Todo banco guarda dados. O que muda é o modelo: a forma como os dados são organizados, como se relacionam e como são consultados. O modelo decide quais perguntas ficam fáceis de responder e quais exigem esforço.
Para comparar, vamos usar o mesmo exemplo em todos os modelos: uma loja com clientes, pedidos e os itens de cada pedido.
O modelo relacional
No modelo relacional, os dados ficam em tabelas com colunas definidas. Cada tipo de coisa tem a sua tabela, e os relacionamentos são feitos por chaves: o pedido guarda o identificador do cliente, e o item guarda o identificador do pedido.
CREATE TABLE clientes (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nome TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
CREATE TABLE pedidos (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
cliente_id BIGINT NOT NULL REFERENCES clientes (id),
status TEXT NOT NULL,
criado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE itens_pedido (
pedido_id BIGINT NOT NULL REFERENCES pedidos (id),
produto_id BIGINT NOT NULL,
quantidade INT NOT NULL CHECK (quantidade > 0)
);O banco garante as regras declaradas: não aceita um pedido de um cliente que não existe, nem um item com quantidade zero. Para montar a tela de um pedido, a consulta junta as tabelas:
SELECT p.id, p.status, c.nome, i.produto_id, i.quantidade
FROM pedidos p
JOIN clientes c ON c.id = p.cliente_id
JOIN itens_pedido i ON i.pedido_id = p.id
WHERE p.id = 981;Três características definem o modelo:
- Esquema na escrita: o formato dos dados é declarado antes, e o banco recusa o que não cabe nele.
- Cada informação num só lugar: o nome do cliente está na tabela de clientes e em nenhum outro lugar. Mudou, mudou para todos os pedidos.
- Consultas que ninguém previu: o SQL combina as tabelas de qualquer forma. Um relatório novo não exige mudar a estrutura.
Os bancos relacionais também oferecem transações: um conjunto de operações que acontece por inteiro ou não acontece. Criar o pedido e os itens fica numa transação, e nunca sobra um pedido sem itens por causa de uma falha no meio. O tópico de transações explica as garantias em detalhe.
NoSQL: um nome para várias famílias
"NoSQL" significa not only SQL. O nome agrupa bancos que não seguem o modelo relacional, mas eles têm pouco em comum entre si. São quatro famílias principais.
Documentos
Cada registro é um documento, parecido com um JSON, que pode conter listas e objetos aninhados. Os dados que costumam ser lidos juntos ficam juntos.
{
"_id": 981,
"status": "enviado",
"cliente": { "id": 42, "nome": "Marina Souza" },
"itens": [
{ "produtoId": 7, "quantidade": 2 },
{ "produtoId": 15, "quantidade": 1 }
]
}A tela do pedido sai de uma única leitura, sem junções. Em troca, o nome do cliente agora está copiado em cada pedido. Se ele mudar, alguém precisa decidir se os pedidos antigos são atualizados. Exemplos: MongoDB, Couchbase, Firestore.
Chave-valor
O modelo mais simples: uma chave aponta para um valor, e o banco não sabe nada sobre o conteúdo. A única consulta é "me dê o valor desta chave". Em troca, ele é extremamente rápido. Muito usado para cache, sessões e contadores. Exemplos: Redis, Memcached e, com recursos a mais, DynamoDB.
Colunares de linha larga
Os dados são organizados pela forma como serão lidos, em partições distribuídas por várias máquinas. Aceitam volumes enormes de escrita, mas cada consulta precisa ser planejada no desenho da tabela. Exemplos: Cassandra, ScyllaDB, Bigtable.
Grafos
Os dados são nós ligados por arestas, e os relacionamentos são o centro do modelo. Perguntas como "amigos de amigos que compraram este produto" são naturais aqui e caras em qualquer outro modelo. Exemplos: Neo4j, Neptune.
Onde a diferença realmente está
| Relacional | Documentos | |
|---|---|---|
| Unidade | Linha numa tabela | Documento com dados aninhados |
| Esquema | Declarado e verificado pelo banco | Flexível; verificado pela aplicação, se for |
| Relacionamentos | Chaves e junções | Dados embutidos ou referências resolvidas pela aplicação |
| Dado repetido | Evitado por desenho | Comum e intencional |
| Consultas novas | Fáceis | Dependem de como os documentos foram desenhados |
A diferença central é quem cuida da integridade e da forma dos dados. No relacional, o banco cuida. No modelo de documentos, a aplicação assume essa responsabilidade em troca de flexibilidade e de leituras mais simples.
Por que isso importa quando a IA escreve o código
Um assistente monta o acesso a qualquer banco com a mesma facilidade, e aceita a escolha que vier no pedido. Os problemas aparecem meses depois:
- Um MongoDB escolhido "porque é flexível" acumula documentos em formatos diferentes, e cada consulta precisa tratar todos eles.
- Dados copiados em vários documentos ficam inconsistentes, porque só um lugar foi atualizado.
- Um relatório simples exige juntar coleções na aplicação, com dezenas de consultas.
- Um banco relacional é usado como fila ou como cache de alto volume, e sofre.
O próximo nível compara os modelos em detalhe e mostra como escolher.
Prompts para aprofundar
Ao abrir no ChatGPT ou no Claude, o prompt é enviado ao serviço escolhido pela URL e também fica copiado na sua área de transferência.
SQL e NoSQL em cinco minutos
Explique em no máximo cinco minutos de leitura a diferença entre bancos SQL e NoSQL, para alguém que programa mas nunca precisou escolher um banco. Cubra só o essencial: o que é o modelo relacional, quais são as famílias NoSQL (documentos, chave-valor, colunar e grafos) e qual pergunta decide entre elas. Use o exemplo de uma loja com clientes, pedidos e itens. No final, me faça três perguntas curtas para eu verificar se entendi, e corrija as minhas respostas.
Os mesmos dados em quatro modelos
Quero entender os modelos de dados vendo os mesmos dados organizados de formas diferentes. Aja como um mentor de backend. Pergunte primeiro qual é a minha experiência com bancos de dados. Use o exemplo de uma loja com clientes, pedidos, itens e produtos, e mostre esses dados, um modelo por vez: 1. Em tabelas relacionais, com as chaves e uma consulta com junção. 2. Em documentos, discutindo o que embutir e o que referenciar. 3. Num banco chave-valor, mostrando quais perguntas ficam possíveis e quais não. 4. Num grafo, com uma pergunta de recomendação. Depois de cada modelo, pergunte qual consulta eu acho que fica difícil nele, e só continue depois da minha resposta. No final, peça que eu explique com minhas palavras quem cuida da integridade dos dados em cada modelo.
Esquema na escrita e esquema na leitura
Quero entender a diferença entre esquema na escrita, dos bancos relacionais, e esquema na leitura, comum nos bancos de documentos. Explique: 1. O que cada abordagem significa na prática, com exemplos de dados entrando no banco. 2. O que acontece quando o formato de um dado muda: adicionar um campo, renomear um campo e mudar um tipo, nas duas abordagens. 3. Onde o esquema passa a morar quando o banco não o verifica, e o que acontece depois de alguns anos e várias versões do código. 4. Como a validação de esquema do MongoDB e as colunas JSONB do PostgreSQL ficam no meio do caminho. Depois, me apresente três situações e pergunte qual abordagem eu prefiro em cada uma, corrigindo o meu raciocínio.
Normalizar ou repetir dados
Quero entender quando vale a pena repetir dados de propósito e quando isso vira um problema. Explique o que é normalização no modelo relacional, com um exemplo de dado repetido e da anomalia que ele causa ao ser atualizado. Depois explique por que os bancos de documentos repetem dados intencionalmente e quais estratégias existem para manter as cópias coerentes: atualizar todas, aceitar cópias históricas e guardar só a referência. Em seguida, me dê cinco exemplos de dados (o nome do cliente num pedido, o preço do produto num item de pedido, o endereço de entrega, a categoria de um produto, o contador de curtidas de uma publicação) e pergunte, para cada um, se eu copiaria ou referenciaria, e por quê. Corrija as minhas respostas.