Banco de Dados para Desenvolvedores

Como escolher, escalar e pensar além do CRUD

Apresentação

Quem vai conduzir esta aula

Alex Seixas

Senior Software Engineer · Engineering Manager

Sou engenheiro de software atuando em produtos e times internacionais, com experiência prática em arquitetura de sistemas, banco de dados, performance, escalabilidade e desenvolvimento de aplicações para diferentes contextos de negócio.

Hoje trabalho como Senior Software Engineer em projetos para Portugal e Canadá e também atuo como Engineering Manager em uma operação nos Estados Unidos, liderando iniciativas técnicas, decisões de arquitetura e evolução de produtos.

Nesta aula, a proposta é trazer uma visão de banco de dados que vai além do CRUD: conectando modelagem, consistência, escalabilidade, sistemas distribuídos e trade-offs reais de arquitetura.

Portugal · Canadá · EUA Arquitetura de Software Sistemas Distribuídos Banco de Dados Escalabilidade Engenharia de Produto
Alex Seixas
Introdução

"Banco de dados são escolhidos somente pelo tipo de dados da aplicação?"

Mito

"Escolho pelo tipo de dado"

Relacional para estruturado, documento para flexível, cache para rápido...

vs
Realidade

Não. O tipo importa, mas está longe de ser o único critério.

Consistência, latência, escala e operação pesam tanto quanto o modelo.

Mindset

O erro mais comum

"Vou de PostgreSQL porque conheço"
"Vou de MongoDB porque é flexível"
"Vou de Redis porque é rápido"

A pergunta correta não é "qual banco eu gosto?"

A pergunta correta é "quais atributos meu sistema precisa ter?"

Critérios

O que realmente influencia a escolha de um banco

Consistência
Disponibilidade
Latência
Escalabilidade
Modelo de consulta
Volume de leitura
Volume de escrita
Tolerância a falhas
Distribuição geográfica
Custo operacional
Complexidade de operação
Necessidade de transações
SQL

Bancos relacionais

Modelo tabular com SQL, joins, constraints e transações ACID

PostgreSQL MySQL SQL Server Oracle
  • Modelo tabular estruturado
  • Integridade referencial
  • Transações ACID
  • Regras de negócio fortes

Casos de uso

Financeiro e pagamentos
ERP, CRM e backoffice
Pedidos e estoque
PostgreSQL

PostgreSQL — referência relacional moderna

ACID

Forte consistência transacional

JSONB

Dados semi-estruturados

Extensível

Tipos, funções, extensões

Índices

B-tree, GIN, GiST, Hash

CTEs & Views

Consultas complexas

Replicação

Ecossistema maduro

Excelente default para a maioria dos produtos com dados estruturados.

NoSQL

NoSQL não é "melhor que SQL"

É outra categoria de trade-offs, não um upgrade natural.

Document DBs

MongoDB, Couchbase

Key-Value

Redis, DynamoDB

Wide-Column

Cassandra, ScyllaDB

Graph DBs

Neo4j, Neptune

Search Engines

Elasticsearch, OpenSearch

Time-Series

InfluxDB, Prometheus

Vector DBs

Pinecone, Weaviate

Event Stores

EventStoreDB, Kafka

Documentos

Bancos de documentos

MongoDBCouchbaseFirestore

Quando faz sentido

  • Dados semi-estruturados
  • Catálogos e perfis
  • CMS e payloads flexíveis

Atenção

Flexibilidade não elimina modelagem. Joins complexos e relacionamentos profundos podem ficar ruins.

Key-Value

Key-value stores

RedisDynamoDBMemcached

Casos de uso

  • Cache e sessão
  • Rate limiting e contadores
  • Dados acessados por chave
  • Filas simples e estruturas temporárias

Trade-off

Velocidade altíssima, mas geralmente com menos poder relacional e consultivo.

Wide-Column

Wide-column databases

CassandraHBaseScyllaDB
  • Foco em escala horizontal
  • Alto volume de escrita
  • Dados distribuídos globalmente

Workloads típicos

Logs, eventos, telemetria, timelines com grandes volumes de escrita e leitura distribuída.

Grafos

Graph databases

Neo4jAmazon Neptune

Nós e relacionamentos — ótimo para conexões complexas.

  • Redes sociais e recomendação
  • Detecção de fraude
  • Permissões e dependências
Diagrama de grafo: User, Post, Tag, Friend
Busca

Search engines

ElasticsearchOpenSearchSolr
  • Busca textual e autocomplete
  • Filtros complexos e relevância
  • Análise de logs

Importante

Search engine normalmente não substitui o banco transacional principal.

Time-Series

Time-series databases

InfluxDBTimescaleDBPrometheus

Dados orientados ao tempo — cada registro carrega um timestamp como dimensão central.

Métricas

Observabilidade e monitoramento

IoT

Sensores e telemetria

Eventos

Séries temporais com agregação

Vetores

Vector databases

Guardam embeddings — representações numéricas do significado de um texto ou imagem. A busca encontra conteúdo parecido, não apenas idêntico.

PineconeWeaviateMilvuspgvector
  • Embeddings e busca semântica
  • IA, RAG e recomendação
  • Similaridade por proximidade

A busca deixa de ser "igualdade exata" e passa a ser "proximidade semântica".

Eventos

Event stores e persistência orientada a eventos

Event Sourcing = guardar cada mudança que aconteceu, não só o resultado final. Como um extrato bancário, não apenas o saldo atual.

Estado atual

Guarda o valor agora: saldo = R$ 500

Histórico de eventos

Guarda tudo que aconteceu: depósito, saque, transferência...

EventStoreDB Kafka como log Tabela de eventos em SQL

Ideia central: Event Sourcing

Distribuídos

O banco muda quando o sistema deixa de ser simples

Deixa de ser "uma tabela em um servidor" e passa a fazer parte de uma arquitetura distribuída.

Replicação
Partição
Eventos & Filas
Consistência eventual
Escalabilidade
Falhas de comunicação
Replicação

Replicação

Copiar os dados do banco principal para outras máquinas. Serve para ler mais rápido, fazer backup e continuar funcionando se o principal cair.

App → Primary → Réplicas
  • Leitura em réplicas
  • Failover automático
  • Backup e disaster recovery
  • Distribuição de carga de leitura
Replicação

O problema da replicação

Replication lag = a cópia demora para receber a atualização. Você escreve no primário, lê na réplica e pode ver dado antigo por alguns segundos.

Replication lag

Fluxo: atualização → primary → lag → réplica com dado antigo

Seu sistema tolera esse atraso ou não?

Consistência

Consistência eventual

Os servidores não ficam iguais na hora, mas depois de um tempo todos convergem. Aceitável quando ver dado levemente desatualizado não é um problema grave.

"Nem todos os nós enxergam o mesmo dado imediatamente, mas o sistema converge depois."

Feed social

Curtidas e analytics

Tracking

Notificações

Dashboards não críticos

Consistência

Quando consistência forte importa

Todo mundo precisa ver o mesmo valor ao mesmo tempo. Quando errar por segundos causa prejuízo real — dinheiro, estoque ou vaga perdida.

Saldo bancário

Pagamento

Estoque crítico

Reserva de assento

Antifraude transacional

Transações financeiras

Nesses cenários, "eventualmente correto" pode ser tarde demais.

Rede

Partição de rede

A rede quebra no meio e dois grupos de servidores ficam isolados — cada um continua funcionando, mas não conseguem conversar entre si.

Dois grupos de nós isolados por partição de rede
CAP

Teorema de CAP

Quando a rede falha, você não consegue garantir dado 100% correto e sistema sempre respondendo ao mesmo tempo. Precisa escolher um lado.

C

Consistency

Todos veem o mesmo dado

A

Availability

Sistema sempre responde

P

Partition Tolerance

Tolera falha de rede

Triângulo CAP: Consistency, Availability, Partition Tolerance

Em um sistema distribuído, diante de partição de rede, não é possível garantir consistência forte e disponibilidade total ao mesmo tempo.

CAP

CAP não é uma escolha permanente de configuração — é a decisão que você toma no momento em que a rede falha.

CAP não significa "escolha 2 para sempre".

Quando a rede falha, você precisa decidir qual lado sacrificar.

CAP

CP vs AP

CP prefere parar ou bloquear a entregar dado errado. AP prefere continuar respondendo, mesmo que o dado ainda não esteja atualizado.

CP — Consistency + Partition

  • Prioriza consistência
  • Pode negar resposta ou bloquear
  • Sistemas sensíveis a erro de dado

Ex.: ZooKeeper, etcd, HBase

AP — Availability + Partition

  • Prioriza disponibilidade
  • Pode retornar dado desatualizado
  • Sistemas que toleram convergência

Ex.: Cassandra, DynamoDB, Couchbase

PACELC

Teorema PACELC

CAP olha o que acontece quando a rede falha. PACELC lembra que, mesmo sem falha, você troca velocidade por dado mais fresco.

Se houver partição (P)

Availability ou Consistency?

Else — sem partição

Latency ou Consistency?

Mesmo sem falha, sistemas distribuídos vivem trade-offs entre latência e consistência.

PACELC

PACELC na prática

Ler do servidor mais próximo é rápido, mas o dado pode estar desatualizado. Ler do servidor central é mais lento, porém mais confiável.

Resposta rápida

Ler da região mais próxima ao usuário

Menor latência, dado pode estar desatualizado

Dado mais atualizado

Buscar na região central / primária

Maior latência, maior consistência

Escala

Sharding e particionamento

Sharding = dividir os dados em pedaços menores e guardar cada pedaço em um servidor diferente. É como separar clientes por andares em vez de colocar todos num único prédio — escala, mas complica consultas e operação.

Por usuário
Por tenant
Por região
Por hash
Por data

Sharding ajuda escala, mas aumenta complexidade de roteamento, rebalanceamento, queries e operação.

Performance

Índices

Atalho que o banco usa para achar linhas sem varrer a tabela inteira — como o índice de um livro. Acelera leitura, mas deixa escrita e armazenamento mais pesados.

  • Índice acelera leitura
  • Índice encarece escrita
  • Consome espaço em disco
  • Índice errado pode não ajudar

Tipos comuns

B-tree Hash Full-text GIN / GiST Compostos
Transações

Transações e ACID

Garantias de que uma operação composta completa tudo corretamente ou não faz nada. Essencial em transferências, pagamentos e qualquer regra de negócio crítica.

A

Atomicity

Tudo ou nada

C

Consistency

Regras válidas

I

Isolation

Sem interferência

D

Durability

Persiste após commit

Transferência: debitar conta A + creditar conta B = uma transação atômica
Modelos

ACID vs BASE

ACID prioriza correção rigorosa. BASE prioriza ficar online e aceitar que os dados convergem depois — comum em sistemas de grande escala.

ACID

  • Atomicidade garantida
  • Consistência forte
  • Transações isoladas
  • Durabilidade confirmada

Bancos relacionais, pagamentos

BASE

  • Basically Available
  • Soft state
  • Eventually consistent

Feeds, analytics, cache distribuído

Modelagem

Normalização vs desnormalização

Normalizar = organizar tabelas para não repetir dados. Desnormalizar = repetir dados de propósito para evitar joins e ler mais rápido.

Normalização

  • Melhora integridade
  • Reduz redundância
  • Mais joins na leitura

Desnormalização

  • Melhora leitura
  • Reduz joins
  • Mais redundância

Nenhuma é "sempre correta" — depende do workload.

Workloads

OLTP vs OLAP

OLTP = banco do dia a dia do app — muitas operações pequenas e rápidas. OLAP = banco de análise — consultas pesadas, relatórios e dashboards.

OLTP

  • Transacional
  • Muitas operações pequenas
  • Sistema operacional do dia a dia

OLAP

  • Análise e agregações pesadas
  • Dashboards e BI
  • Histórico e relatórios
Analytics

Data warehouses e analytics

Copia dados do banco do app para um ambiente feito para consultas pesadas. Relatórios e BI rodam lá — sem travar o sistema que o usuário usa no dia a dia.

BigQuerySnowflakeRedshiftClickHouse
App → Transacional → ETL → Warehouse → Dashboard

Analytics pesado nem sempre deve rodar no banco transacional principal.

Arquitetura

Polyglot Persistence

Usar mais de um banco no mesmo sistema — cada um resolve um problema diferente. Não é fraqueza; é escolher a ferramenta certa para cada job.

PostgreSQL

Transações

Redis

Cache

Elasticsearch

Busca

S3

Arquivos

BigQuery

Analytics

pgvector

IA / embeddings

O problema define o banco, não o contrário.

Decisão

Como escolher na prática

Qual é o dado?
Como ele será consultado?
Qual o volume de leitura?
Qual o volume de escrita?
Precisa de transação?
Pode aceitar consistência eventual?
Qual a latência aceitável?
Vai operar em múltiplas regiões?
Precisa de busca textual?
Precisa de analytics pesado?
O time sabe operar esse banco?
O custo operacional cabe no contexto?
Cenários

Exemplos reais de decisão

E-commerce pequeno

PostgreSQL + Redis

Feed social / timeline

Wide-column + cache + eventos

Busca em catálogo

PostgreSQL + Elasticsearch

IA com documentos

PostgreSQL + pgvector

Essencial

"Sempre escolha o banco de dados de acordo com os atributos que você quer que seu sistema tenha."

Conclusão

Conclusão

  • Banco de dados não é só armazenamento
  • Banco é decisão de arquitetura
  • Escolher banco é escolher trade-offs
  • Escala, consistência, latência e operação importam tanto quanto o modelo do dado

Perguntas?

Banco de Dados para Desenvolvedores