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çãoTipo recomendado
Cache de sessões / dados temporáriosChave-Valor (Redis)
Catálogo com atributos variáveis por produtoDocumento (MongoDB)
Métricas de servidores / APMSérie temporal
Logs de eventos em alto volumeColuna larga
Redes sociais, recomendaçõesGrafo (Neo4j)
Schema muda frequentemente / prototipagemDocumento

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

Referências