Banco de Dados Relacional (SQL)
Organiza dados em tabelas com linhas e colunas, relacionamentos via chaves estrangeiras, garantindo integridade por ACID e SQL padrão.
- Armazenamento: B-trees para índices + heaps em páginas. Tamanhos variam por engine: PostgreSQL 8KB (padrão), MySQL InnoDB 16KB, SQLite 4KB (padrão do sistema de arquivos)
- Consistência: ACID nativo. WAL garante durabilidade antes de confirmar; MVCC permite leituras consistentes sem bloquear escritas
- Distribuição: Single-node nativo; sharding manual ou via Vitess/Citus. Replicação assíncrona (streaming) é padrão; síncrona só em clusters ativos com trade-off de latência
- Consulta: Query planner otimiza joins e índices; custo é proporcional à cardinalidade e selectividade
- Schema: Rígido por design. ALTER TABLE pode bloquear tabelas grandes em engines antigas; online DDL é feature recente e não universal
CREATE TABLE pedidos (
id SERIAL PRIMARY KEY,
cliente_id INT REFERENCES clientes(id),
total DECIMAL(10,2),
criado_em TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_cliente ON pedidos(cliente_id);
- E-commerce: Inventário e pedidos com consistência transacional (evita oversell em flash sales)
- Sistemas financeiros: Auditoria, compliance SOX/PCI, movimentações atômicas entre contas
- CRM/ERP: Relacionamentos complexos entre clientes, oportunidades e histórico de interações
- Payroll/HR: Integridade referencial entre folha, benefícios e contabilidade
- SQLite embarcado: Apps mobile/desktop offline-first com zero configuração de servidor
- Latência: Tipicamente milissegundos para queries indexadas; latência sobe com lock contention em writes concorrentes ou joins mal otimizados
- Throughput: Limitado pela capacidade do nó único; sharding adiciona complexidade de joins cross-shard e consistência distribuída
- Linguagem: SQL ANSI + DDL/DML/DCL; stored procedures opcionais (PostgreSQL PL/pgSQL, SQL Server T-SQL)
- ORMs: Hibernate, SQLAlchemy, Prisma — cuidado com queries N+1 em lazy loading, que destroem performance em produção
- Dados altamente desnormalizados (deep object graphs) — N+1 em ORM é difícil de otimizar sem redesign
- Escalabilidade horizontal necessária como primeiro requisito — sharding manual é complexo e quebra joins cross-shard
- Dados não-estruturados binários grandes — imagens, vídeos, logs brutos (use object store S3/MinIO)
- Latência crítica com replicação síncrona entre regiões — WAL sync entre nós é bottleneck de rede
- Padrões de acesso imprevisíveis com schema em constante mutação — ALTER TABLE em tabelas grandes pode travar