Pular para o conteúdo
Tecnologia

Design de database ruim causa bugs, performance issues e refactors caros. Aprenda princípios que criam schemas escaláveis e maintainable.

Conceitos Principais

Normalização

1NF: atomic values. 2NF: sem partial dependencies. 3NF: sem transitive dependencies. Reduz redundância.

Primary Keys

Único, não-null, imutável. SERIAL, UUID, ou composite. Index automático. Escolha afeta joins.

Foreign Keys

Referencia PK de outra tabela. Garante integridade referencial. ON DELETE CASCADE/SET NULL/RESTRICT.

Denormalização

Duplicação intencional para performance. Trade-off: storage vs speed. Use em read-heavy.

Passo a Passo

  1. Defina Entidades: Identifique nouns: User, Order, Product. Cada entidade vira tabela. Atributos viram colunas.
  2. Estabeleça Relacionamentos: 1-to-1: user → profile (FK em profile). 1-to-many: user → orders (FK em orders). Many-to-many: products ↔ orders (junction table).
  3. Normalize: Remova redundância. Separe em tabelas. Users: id, name. Addresses: id, user_id, street. Não: users.address1, address2, ...
  4. Adicione Constraints: NOT NULL, UNIQUE, CHECK. PRIMARY KEY, FOREIGN KEY. Garante integridade no DB level.
  5. Plan Indexes: PK (automático), FKs, WHERE clauses, JOIN columns. Não indexe tudo. Monitor usage.

Boas Praticas

Recomendacoes

• Normalize até 3NF

• UUID ou BIGSERIAL para PKs

• Foreign keys com ON DELETE definido

• NOT NULL quando aplicável

• Naming conventions consistentes

• Índices em FKs

• Created_at, updated_at timestamps

• Soft deletes (deleted_at) para audit

• Enums para status fields

• JSON para dados flexíveis

• Comentários em tabelas complexas

• Version schema (migrations)

• Backup strategy

• Test em staging primeiro

• Document decisions

Erros Comuns

Evite estes erros

• Sem primary keys

• Sem foreign keys (integridade app-level)

• Naming inconsistente

• Denormalização prematura

• Sem índices em FKs

• VARCHAR(255) para tudo

Checklist

  • Entidades identificadas
  • Relacionamentos definidos
  • Schema normalizado
  • Constraints adicionadas
  • Foreign keys configuradas
  • Índices planejados
  • Naming conventions aplicadas