📚
DP-900 na prática
Artigo 3
Ver série completa →
Docência

DP-900 na prática [3]: Dados não relacionais e Cosmos DB

Todo mundo entende banco relacional intuitivamente: tabelas, linhas, colunas, SQL. NoSQL confunde porque não é um tipo de banco, é uma categoria com quatro modelos completamente diferentes, cada um resolvendo um problema específico.

O DP-900 testa se você sabe qual modelo usar para qual caso de uso. Chave-valor não é a mesma coisa que documento, que não é a mesma coisa que grafo. A confusão entre eles é o erro mais comum nessa parte do exame.

Por que NoSQL?

Bancos relacionais enfrentam limitações em escala horizontal e esquemas flexíveis. NoSQL resolve isso sacrificando algumas garantias ACID em favor de:

  • Escala horizontal (mais máquinas, não máquinas maiores)
  • Alta disponibilidade distribuída
  • Esquema flexível (evolução sem migrações)

Teorema CAP, sistemas distribuídos só podem garantir dois de três:

  • Consistency, todos veem os mesmos dados
  • Availability, sistema sempre responde
  • Partition tolerance, funciona mesmo com falhas de rede

Tipos de NoSQL

Chave-valor, pares simples chave:valor. Ultra-rápido para leitura/escrita.

# Redis (via Azure Cache for Redis)
import redis
r = redis.Redis(host='meu-redis.redis.cache.windows.net', port=6380,
                password='MINHA_SENHA', ssl=True)

r.set('sessao:abc123', '{"userId": 1, "role": "admin"}', ex=3600)
session = r.get('sessao:abc123')

Documento, armazena documentos JSON/BSON. Esquema flexível por documento.

// Dois "clientes" com campos diferentes, válido em NoSQL
{"id": 1, "nome": "Rafael", "email": "rafael@ex.com"}
{"id": 2, "nome": "Ana", "email": "ana@ex.com", "empresa": "TechCorp", "cargo": "CTO"}

Colunar, dados agrupados por coluna em vez de linha. Ótimo para analytics.

  • Apache Cassandra (disponível via Cosmos DB API for Cassandra)

Grafo, nós e arestas para representar relacionamentos complexos.

  • Casos de uso: redes sociais, detecção de fraude, recomendações
  • Disponível via Cosmos DB API for Gremlin

Azure Cosmos DB

Banco NoSQL globalmente distribuído, multi-API, SLA de 99,999%:

# Criar conta Cosmos DB (API for NoSQL)
az cosmosdb create \
  --name meu-cosmos-2026 \
  --resource-group meu-rg \
  --locations regionName=brazilsouth failoverPriority=0 \
  --default-consistency-level Session

# Criar banco e container
az cosmosdb sql database create \
  --account-name meu-cosmos-2026 \
  --resource-group meu-rg \
  --name ecommerce

az cosmosdb sql container create \
  --account-name meu-cosmos-2026 \
  --resource-group meu-rg \
  --database-name ecommerce \
  --name produtos \
  --partition-key-path "/categoria" \
  --throughput 400
from azure.cosmos import CosmosClient, PartitionKey

client = CosmosClient("https://meu-cosmos-2026.documents.azure.com", "MINHA_CHAVE")
db = client.get_database_client("ecommerce")
container = db.get_container_client("produtos")

# Inserir documento
produto = {
    "id": "prod-001",
    "categoria": "eletronicos",
    "nome": "Notebook",
    "preco": 3500.00,
    "especificacoes": {
        "ram": "16GB",
        "storage": "512GB SSD",
        "processador": "Intel Core i7"
    }
}
container.create_item(body=produto)

# Consultar
query = "SELECT * FROM c WHERE c.categoria = 'eletronicos' AND c.preco < 5000"
items = list(container.query_items(query=query, enable_cross_partition_query=True))

Partition Key, critério de distribuição dos dados. Escolha ruim = hotspot (uma partição com todo o tráfego). Escolha boa = distribuição uniforme.

Request Units (RU/s), unidade de throughput do Cosmos DB. 1 RU = 1 leitura de documento de 1KB. Escritas custam ~5 RUs.

Níveis de consistência do Cosmos DB

NívelGarantiaLatênciaCusto RU
StrongLinearizabilidadeAltaAlto
Bounded StalenessAtraso máximo configurávelAltaAlto
SessionConsistência por sessãoMédiaMédio
Consistent PrefixSem leituras fora de ordemBaixaBaixo
EventualEventual convergênciaBaixaBaixo

Azure Storage para dados não relacionais

Azure Table Storage, chave-valor em formato tabular, sem schema fixo, baixo custo.

# Criar tabela
az storage table create \
  --name produtos \
  --account-name meustorage2026

# Inserir entidade
az storage entity insert \
  --account-name meustorage2026 \
  --table-name produtos \
  --entity PartitionKey=eletronicos RowKey=notebook-01 nome="Notebook Dell" preco=3500
Dica para o exame: Cosmos DB é a resposta quando o enunciado menciona distribuição global, SLA de 99,999%, múltiplas APIs NoSQL, ou latência garantida em milissegundos. Para dados simples de chave-valor sem requisitos de escala global, Azure Table Storage é mais econômico.

O que cai no exame

  • Tipos de NoSQL: chave-valor, documento, colunar, grafo
  • Cosmos DB: multi-API, global, 99,999% SLA, RU/s
  • Partition key e seu impacto na performance
  • Níveis de consistência (Strong vs Eventual)
  • Cosmos DB vs Azure Table Storage (quando usar cada)
  • Teorema CAP aplicado a bancos distribuídos