O que significa “validação final” do modelo de dados
Validação final é a checagem sistemática de que o modelo (conceitual e/ou lógico) está pronto para implementação porque: (1) cobre os requisitos e regras de negócio relevantes, (2) mantém consistência estrutural (cardinalidades, opcionalidades e integridade), (3) evita redundâncias indevidas e ambiguidades, (4) permite operações reais (inserir, atualizar, consultar) sem “gambiarras”, e (5) suporta relatórios básicos esperados. Nesta etapa, o foco é testar o modelo como se ele já estivesse em uso, usando cenários e casos de borda, e ajustar com base no feedback do negócio.
Checklist prático de qualidade (antes de implementar)
1) Cobertura de requisitos e regras
- Mapeamento requisito → estruturas: para cada requisito/regra, existe uma ou mais tabelas/colunas/constraints que o suportam?
- Sem requisito “órfão”: nenhum requisito importante ficou sem representação no modelo.
- Sem estrutura “sem dono”: toda tabela/coluna existe por um motivo (requisito, regra, relatório, auditoria).
- Regras críticas estão “enforçadas”: o que precisa ser obrigatório/único/limitado está refletido em constraints (quando aplicável) ou em regras de aplicação bem justificadas.
2) Consistência de cardinalidades e opcionalidades
- Cardinalidades coerentes com o negócio: relações 1:1, 1:N, N:N (com tabela associativa) refletem o que acontece na prática.
- Opcionalidade correta: campos e relacionamentos opcionais/obrigatórios estão alinhados ao processo real (ex.: cadastro pode existir antes de aprovação?).
- Evitar “obrigatoriedade impossível”: não exigir dados que só existem depois (ex.: exigir
data_pagamentono momento de criar um pedido).
3) Constraints alinhadas às regras (e sem contradições)
- NOT NULL apenas onde realmente é obrigatório no momento do registro.
- UNIQUE onde há unicidade de negócio (ex.: código externo, número de documento, combinação de colunas).
- CHECK para domínios simples (ex.: status permitido, faixa numérica, datas coerentes).
- Defaults coerentes (ex.: status inicial).
- Sem constraints conflitantes: por exemplo, coluna opcional com
UNIQUEpode permitir múltiplos nulos dependendo do SGBD; valide o comportamento esperado.
4) Ausência de redundâncias indevidas
- Não duplicar o mesmo fato em duas tabelas/colunas sem necessidade (ex.: guardar total e itens sem regra clara de cálculo e atualização).
- Campos derivados: se armazenar, definir regra de atualização e fonte de verdade.
- Evitar “cópias por conveniência”: duplicar nome do cliente em pedido pode gerar inconsistência; se for necessário por histórico, explicitar a intenção (snapshot) e a regra.
5) Padronização de nomes e semântica
- Padrão consistente: singular/plural, idioma, separador (
snake_case), prefixos/sufixos. - Nomes autoexplicativos: evitar abreviações ambíguas (
dt,vl) sem padrão. - Chaves e FKs nomeadas: constraints com nomes previsíveis (facilita manutenção).
- Semântica estável: coluna
statusdeve ter domínio claro e documentado.
6) Chaves definidas e coerentes
- PK em todas as tabelas (inclusive associativas, conforme estratégia adotada).
- Chaves candidatas relevantes protegidas por
UNIQUE(quando aplicável). - Sem PK “mutável” se isso causar cascatas e risco operacional.
- Chaves compostas: validar se fazem sentido e se não dificultam integrações/relatórios.
7) Integridade referencial adequada
- FKs presentes onde há relacionamento obrigatório de consistência.
- Ações ON DELETE/ON UPDATE alinhadas ao negócio:
RESTRICT,CASCADE,SET NULL(evitar cascatas perigosas em entidades centrais). - Evitar “órfãos”: tabelas dependentes não devem ficar sem pai quando isso for inválido.
- Relacionamentos opcionais: FK pode ser nula apenas se o processo permitir.
8) Suporte a relatórios básicos
- Consultas essenciais são possíveis sem lógica excessiva: totais por período, por cliente, por status, por categoria etc.
- Dimensões de filtro existem (datas, status, tipo, unidade, canal).
- Histórico/estado: se relatórios exigem “como era”, o modelo precisa suportar (por exemplo, status com data, ou tabela de eventos).
- Granularidade correta: o nível de detalhe armazenado permite agregações sem perda (ex.: itens de pedido vs. apenas total).
Validação por cenários: como testar o modelo “na prática”
A validação por cenários consiste em simular operações reais com dados de exemplo. Você cria um conjunto pequeno de registros e tenta executar inserções e consultas típicas. Se a operação exigir contornos (campos temporários, nulos indevidos, duplicações, updates complexos), isso indica ajuste necessário.
Passo a passo para montar cenários de validação
- Liste 5 a 10 fluxos do negócio (ex.: cadastrar cliente, criar pedido, faturar, cancelar, registrar pagamento, emitir relatório).
- Para cada fluxo, defina: entradas mínimas, estados intermediários, estados finais e dados obrigatórios em cada etapa.
- Crie dados de teste pequenos (2 a 5 registros por entidade) cobrindo variações.
- Execute “testes de inserção”: tente inserir na ordem natural do processo e veja se constraints bloqueiam algo que deveria ser permitido (ou permitem algo que deveria ser proibido).
- Execute “testes de consulta”: tente responder perguntas do negócio com joins e filtros simples; se ficar impossível ou confuso, revise o modelo.
- Registre achados: para cada problema, anote a regra envolvida e a alteração proposta (constraint, coluna, relacionamento, tabela associativa, domínio).
Exemplos práticos de cenários (inserção e consulta)
A seguir, exemplos genéricos (adaptáveis ao seu domínio) para validar pontos comuns: opcionalidade, integridade, unicidade e suporte a relatórios.
Cenário A: cadastro e criação de pedido (ordem natural do processo)
Objetivo: verificar se o modelo permite criar um pedido com o mínimo necessário e evoluir o estado depois.
-- Inserção mínima de cliente (exemplo genérico) INSERT INTO cliente (cliente_id, nome, email) VALUES (1, 'Ana Lima', 'ana@exemplo.com'); -- Criar pedido sem pagamento ainda INSERT INTO pedido (pedido_id, cliente_id, data_criacao, status) VALUES (100, 1, '2026-01-10', 'ABERTO'); -- Inserir itens do pedido INSERT INTO pedido_item (pedido_id, produto_id, quantidade, preco_unitario) VALUES (100, 10, 2, 39.90);O que validar:
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
pedido.cliente_idé obrigatório? Deve ser, se pedido não existe sem cliente.pedido.statustem domínio controlado (ex.:ABERTO,FATURADO,CANCELADO) viaCHECKou tabela de domínio.- É possível inserir
pedidosempagamento(se o processo permitir)? Se não, a FK/NOT NULL está rígida demais. pedido_itemimpede duplicidade indevida (ex.: mesmo produto repetido no mesmo pedido) comUNIQUE(pedido_id, produto_id)se essa for a regra.
Cenário B: regra de unicidade (evitar duplicatas de negócio)
Objetivo: garantir que o modelo bloqueia duplicidades que o negócio considera inválidas.
-- Tentativa de duplicar email do cliente (se email for único) INSERT INTO cliente (cliente_id, nome, email) VALUES (2, 'Ana L.', 'ana@exemplo.com');O que validar:
- Existe
UNIQUE(email)(ou outra chave candidata) se o email for identificador de negócio? - Se o email puder ser nulo, o comportamento de múltiplos nulos é aceitável?
Cenário C: integridade referencial e deleções
Objetivo: verificar se o modelo impede órfãos e se as ações de deleção fazem sentido.
-- Tentar apagar um cliente com pedidos existentes DELETE FROM cliente WHERE cliente_id = 1;O que validar:
- Se o negócio não permite apagar cliente com histórico, a FK deve estar com
ON DELETE RESTRICT(ou equivalente). - Se o negócio permite “anonimizar” em vez de apagar, o modelo precisa de estratégia (ex.: campos de anonimização) em vez de
CASCADE. - Evitar
CASCADEem cadeia que apague pedidos, itens e pagamentos sem intenção explícita.
Cenário D: casos de borda de opcionalidade (dados que chegam depois)
Objetivo: validar colunas que só existem em etapas posteriores.
-- Pedido criado sem data de faturamento INSERT INTO pedido (pedido_id, cliente_id, data_criacao, status, data_faturamento) VALUES (101, 1, '2026-01-11', 'ABERTO', NULL); -- Atualiza quando faturar UPDATE pedido SET status = 'FATURADO', data_faturamento = '2026-01-12' WHERE pedido_id = 101;O que validar:
data_faturamentonão deve serNOT NULLse o pedido nasce “aberto”.- Se
status='FATURADO'exigedata_faturamento, isso pode ser garantido por regra adicional (ex.: trigger/constraint avançada) ou validação na aplicação; registre a decisão.
Cenário E: relatório básico (o modelo responde perguntas comuns?)
Objetivo: testar se consultas típicas são diretas.
-- Total vendido por mês (exemplo) SELECT date_trunc('month', p.data_criacao) AS mes, SUM(i.quantidade * i.preco_unitario) AS total FROM pedido p JOIN pedido_item i ON i.pedido_id = p.pedido_id WHERE p.status IN ('FATURADO') GROUP BY 1 ORDER BY 1;O que validar:
- Existe data adequada para agregação (criação, faturamento, pagamento) conforme o conceito de “venda” do negócio.
- O status necessário está disponível e confiável.
- O total é calculável a partir da granularidade correta (itens). Se o negócio exige total “fechado” (com descontos, impostos), verifique se há estrutura para isso sem redundância inconsistente.
Como ajustar o modelo a partir dos testes e feedback do negócio
1) Quando um teste “não deixa inserir” algo válido
- Sintoma: constraint rígida demais (NOT NULL, FK obrigatória, CHECK restritivo).
- Ajustes típicos: tornar coluna opcional, separar entidade em fases (ex.: rascunho vs. confirmado), introduzir status/etapa, permitir FK nula temporariamente com regra de transição.
- Pergunta de validação: “Em que momento do processo esse dado passa a ser obrigatório?”
2) Quando um teste “deixa inserir” algo inválido
- Sintoma: falta de constraint (UNIQUE, FK, CHECK) ou relacionamento mal definido.
- Ajustes típicos: adicionar
UNIQUEem chaves candidatas, criar tabela associativa para N:N, adicionarCHECKde domínio, reforçar FK e ações de deleção. - Pergunta de validação: “Qual regra impede isso no mundo real?”
3) Quando o relatório fica complexo demais
- Sintoma: joins excessivos, falta de datas/status, granularidade errada, necessidade de “adivinhar” o significado.
- Ajustes típicos: incluir atributos de classificação (tipo/canal), criar entidade de eventos/linha do tempo, armazenar snapshot quando necessário e justificado, criar visões (views) para consumo (sem mudar o modelo base).
- Pergunta de validação: “O relatório precisa do estado atual ou do estado histórico?”
4) Quando aparecem casos de borda no feedback do negócio
Casos de borda são situações raras, mas reais, que quebram suposições do modelo. Trate-os com um ciclo curto: descrever o caso, simular com dados, identificar onde o modelo falha e escolher a menor mudança que preserve consistência.
| Caso de borda | Risco no modelo | Ajuste comum |
|---|---|---|
| Entidade pode existir sem “pai” temporariamente | FK obrigatória impede fluxo | Permitir FK nula + status de rascunho + regra de transição |
| Um identificador “quase sempre” é único, mas há exceções | UNIQUE bloqueia operação legítima | Unicidade composta (ex.: tipo+numero+pais) ou regra por período |
| Cancelamento exige manter histórico | Deleção física apaga evidências | Status de cancelado + motivo + data; restringir delete |
| Valor calculado precisa ser auditável | Recalcular muda o passado | Armazenar valor fechado + origem do cálculo + versão/regra |
Checklist operacional: revisão final em 30–60 minutos
Roteiro rápido
- Requisitos: pegue a lista e marque “atendido por” (tabelas/colunas/constraints/consultas).
- Fluxos: execute 5 cenários de inserção e 5 consultas essenciais.
- Integridade: tente inserir FKs inválidas, duplicar chaves candidatas e apagar registros “pais”.
- Consistência: revise opcionalidades e defaults para estados iniciais.
- Nomenclatura: faça varredura de nomes inconsistentes e padronize.
- Redundância: identifique campos derivados/snapshots e documente a regra.
- Relatórios: valide 3 perguntas do negócio com SQL simples (agregação + filtros).
Modelo de checklist (copie e preencha)
- [ ] Todo requisito tem suporte no modelo (tabela/coluna/constraint/consulta)
- [ ] Não existem tabelas/colunas sem justificativa
- [ ] Cardinalidades e opcionalidades revisadas com o negócio
- [ ] PK definida em todas as tabelas
- [ ] Chaves candidatas protegidas (UNIQUE) quando aplicável
- [ ] FKs presentes e ações de deleção/atualização alinhadas ao processo
- [ ] Domínios controlados (CHECK/tabela de domínio) para status/tipos críticos
- [ ] Campos obrigatórios no momento certo (sem obrigatoriedade prematura)
- [ ] Redundâncias intencionais estão documentadas (snapshot/derivado) e têm regra de manutenção
- [ ] Nomes padronizados e sem ambiguidades
- [ ] Consultas de relatórios básicos funcionam com joins e filtros diretos
- [ ] Casos de borda conhecidos foram simulados e resolvidos
- [ ] Ajustes pendentes foram registrados com impacto e decisão (modelo vs. aplicação)