Ideia central
NoSQL (“Not Only SQL”) é um termo guarda-chuva para bancos de dados que não seguem o modelo relacional. Cada tipo de banco NoSQL é otimizado para um padrão específico de dados e acesso. A motivação surgiu da necessidade de escala horizontal, schemas flexíveis e alta disponibilidade que bancos relacionais tradicionais não entregavam bem.
Bancos de Documentos
Armazenam dados como documentos JSON/BSON semi-estruturados. Cada documento é autocontido e pode ter estrutura diferente dos demais.
Exemplos: MongoDB, Couchbase, Firestore, CouchDB
// Documento em MongoDB
{
"_id": "507f1f77bcf86cd799439011",
"nome": "Logan Merazzi",
"email": "[email protected]",
"enderecos": [
{ "tipo": "casa", "cidade": "Canoas", "cep": "92000-000" },
{ "tipo": "trabalho", "cidade": "Porto Alegre" }
],
"preferencias": { "tema": "dark", "idioma": "pt-BR" }
}Quando usar: catálogos de produtos, perfis de usuário, CMS, dados com schema variável
Cuidados: sem joins nativos eficientes; relacionamentos complexos exigem múltiplas queries ou desnormalização
Bancos de Chave-Valor
O modelo mais simples: um dicionário distribuído. Acesso sempre por chave exata, extremamente rápido.
Exemplos: Redis, DynamoDB, etcd, Memcached
SET usuario:1001:sessao "jwt_token_abc123" EX 3600
GET usuario:1001:sessao
→ "jwt_token_abc123"
Redis vai além do simples K-V: suporta Strings, Hashes, Lists, Sets, Sorted Sets, Streams, Pub/Sub e scripts Lua.
Quando usar: cache, sessões de usuário, filas, contadores, rate limiting, leaderboards
Bancos de Coluna Larga (Wide Column)
Dados organizados em famílias de colunas. Cada linha pode ter colunas diferentes. Otimizado para escritas massivas e leituras por intervalo de chave.
Exemplos: Apache Cassandra, HBase, Google Bigtable
-- Cassandra Query Language (CQL)
CREATE TABLE eventos (
sensor_id UUID,
timestamp TIMESTAMP,
temperatura FLOAT,
PRIMARY KEY (sensor_id, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);Quando usar: IoT/séries temporais, logs, histórico de atividades, dados de telemetria com volumes massivos
Cuidados: modelagem orientada a queries (não ao dado), com o schema definido pelas perguntas que você vai fazer
Bancos de Série Temporal
Especializados em dados indexados por tempo. Compressão e retenção automáticas, queries nativas para janelas de tempo e agregações temporais.
Exemplos: InfluxDB, TimescaleDB, Prometheus, QuestDB
-- TimescaleDB
SELECT time_bucket('1 hour', time) AS hora,
avg(temperatura) AS media_temp
FROM leituras
WHERE sensor_id = 'sensor-01'
AND time > NOW() - INTERVAL '24 hours'
GROUP BY hora
ORDER BY hora DESC;Quando usar: métricas de infraestrutura, monitoramento de aplicações, dados financeiros de alta frequência, IoT
Quando NoSQL faz sentido
| Situação | Tipo recomendado |
|---|---|
| Cache de sessões / dados temporários | Chave-Valor (Redis) |
| Catálogo com atributos variáveis por produto | Documento (MongoDB) |
| Métricas de servidores / APM | Série temporal |
| Logs de eventos em alto volume | Coluna larga |
| Redes sociais, recomendações | Grafo (Neo4j) |
| Schema muda frequentemente / prototipagem | Documento |
Trade-offs comuns
- Sem transações ACID multi-documento (maioria dos NoSQL): consistência eventual
- Sem joins: você desnormaliza ou faz múltiplas queries na aplicação
- Queries ad-hoc são mais limitadas, sendo necessário modelar para os acessos previstos
- Escalabilidade horizontal é nativa, com sharding automático na maioria
Conexões
- db-tipos-de-bancos-de-dados - Comparativo geral de tipos de banco
- db-relacional - Modelo relacional como contraponto
- db-grafo - Tipo especializado de NoSQL para relacionamentos
Referências
- MongoDB Docs
- Redis Documentation
- Apache Cassandra Docs
- Martin Fowler & Pramod Sadalage - NoSQL Distilled