Validação final do modelo de dados: cenários, testes e checklist de qualidade

Capítulo 16

Tempo estimado de leitura: 11 minutos

+ Exercício

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_pagamento no 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 UNIQUE pode 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 status deve 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

  1. Liste 5 a 10 fluxos do negócio (ex.: cadastrar cliente, criar pedido, faturar, cancelar, registrar pagamento, emitir relatório).
  2. Para cada fluxo, defina: entradas mínimas, estados intermediários, estados finais e dados obrigatórios em cada etapa.
  3. Crie dados de teste pequenos (2 a 5 registros por entidade) cobrindo variações.
  4. 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).
  5. Execute “testes de consulta”: tente responder perguntas do negócio com joins e filtros simples; se ficar impossível ou confuso, revise o modelo.
  6. 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:

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

  • pedido.cliente_id é obrigatório? Deve ser, se pedido não existe sem cliente.
  • pedido.status tem domínio controlado (ex.: ABERTO, FATURADO, CANCELADO) via CHECK ou tabela de domínio.
  • É possível inserir pedido sem pagamento (se o processo permitir)? Se não, a FK/NOT NULL está rígida demais.
  • pedido_item impede duplicidade indevida (ex.: mesmo produto repetido no mesmo pedido) com UNIQUE(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 CASCADE em 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_faturamento não deve ser NOT NULL se o pedido nasce “aberto”.
  • Se status='FATURADO' exige data_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 UNIQUE em chaves candidatas, criar tabela associativa para N:N, adicionar CHECK de 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 bordaRisco no modeloAjuste comum
Entidade pode existir sem “pai” temporariamenteFK obrigatória impede fluxoPermitir FK nula + status de rascunho + regra de transição
Um identificador “quase sempre” é único, mas há exceçõesUNIQUE bloqueia operação legítimaUnicidade composta (ex.: tipo+numero+pais) ou regra por período
Cancelamento exige manter históricoDeleção física apaga evidênciasStatus de cancelado + motivo + data; restringir delete
Valor calculado precisa ser auditávelRecalcular muda o passadoArmazenar valor fechado + origem do cálculo + versão/regra

Checklist operacional: revisão final em 30–60 minutos

Roteiro rápido

  1. Requisitos: pegue a lista e marque “atendido por” (tabelas/colunas/constraints/consultas).
  2. Fluxos: execute 5 cenários de inserção e 5 consultas essenciais.
  3. Integridade: tente inserir FKs inválidas, duplicar chaves candidatas e apagar registros “pais”.
  4. Consistência: revise opcionalidades e defaults para estados iniciais.
  5. Nomenclatura: faça varredura de nomes inconsistentes e padronize.
  6. Redundância: identifique campos derivados/snapshots e documente a regra.
  7. 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)

Agora responda o exercício sobre o conteúdo:

Durante a validação por cenários, um teste de inserção bloqueia a criação de um pedido sem pagamento, embora o processo permita registrar o pagamento depois. Qual ajuste é mais adequado?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Se o processo permite criar o pedido antes do pagamento, a constraint este1 redgida demais. O ajuste correto e9 alinhar opcionalidade e momento de obrigatoriedade, mantendo a consisteancia com regras claras (no banco ou na aplicae7e3o).

Capa do Ebook gratuito Modelagem de Dados do Zero: Entidades, Relacionamentos e Regras de Negócio
100%

Modelagem de Dados do Zero: Entidades, Relacionamentos e Regras de Negócio

Novo curso

16 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.