Pular para o conteúdo

Projete até à terceira forma normal, depois recue

Também em 28 idiomas

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A park seen from above: paths at right angles, and one diagonal shortcut that people kept walking, now deliberately paved, with the old worn track still faint beside it.
Imagem gerada com IA

Módulo 5 de 6 do capítulo Modelar dados pelo significado, capítulo 2 do curso Data Architect. Cada módulo sustenta-se sozinho. Anterior: Coloque os dados onde eles pertencem · Próximo: Transforme o modelo em Salesforce

A pergunta que este módulo responde: Quando me devo afastar de propósito de um modelo normalizado e limpo?

No último módulo, disse-lhe para projetar até à terceira forma normal.

Agora vou dizer-lhe para a quebrar.

Às vezes.

Esta é uma distinção importante. Há uma grande diferença entre construir sem querer um modelo de dados desarrumado e desnormalizar de propósito um modelo limpo. Se não entende onde os dados pertencem, à partida, copiá-los para outro lugar não é arquitetura. É só duplicação.

Mas, depois de entender o modelo lógico limpo, posso tomar a decisão consciente de dar aos dados outra forma para as pessoas e os sistemas que os consomem.

Projete até à terceira forma normal onde for viável. Depois recue quando for preciso.

Repare no que esta frase não diz. Não diz que a terceira forma normal é mais fácil de entender. Às vezes é mais difícil: um modelo totalmente normalizado pode espalhar uma ideia de negócio por cinco objetos, e as pessoas que o usam têm de a remontar na cabeça. A normalização diz-me onde pertence cada facto. Não promete que essa é a forma mais fácil de ler, usar ou reportar. É exatamente por isso que recuar é uma competência de design, e não um fracasso.

Comece por modelar a verdade. Depois decida como essa verdade precisa de ser entregue.

De volta aos cães, e desta vez fazemos algumas escolhas deliberadas.

Raça: uma lista de opções, ou uma tabela própria? Passe-a pelas perguntas que lhe vou dar mais adiante neste módulo. Há mais do que uma coluna de informação? Sim: o porte, pelo menos. Quantos valores? Os kennel clubs reconhecem algumas centenas de raças (só o American Kennel Club lista 205), bem acima da minha regra prática de uns 20. Por isso, a Raça merece a sua própria tabela, e cada cão aponta para a sua raça. Isso resolve a pergunta que trazemos desde o módulo 1: a Raça é uma caixa própria.

Nível de habilidade: uma lista de opções. A aprender, Bom, Especialista. Três rótulos, nada mais a dizer sobre eles, e não vão mudar. É exatamente para isso que serve uma lista de opções.

Quantos truques sabe cada cão? A resposta já está no modelo: conte os registos de Truque do cão desse cão. Mas o treinador quer esse número em todos os relatórios, para ordenar e filtrar por ele, sem montar um relatório sobre duas tabelas. Por isso recuo, e mantenho uma contagem de Truques conhecidos diretamente no cão. Isso é uma cópia. A verdade continua a viver no Truque do cão; a contagem é uma representação dela, e tem de ficar sincronizada. O Salesforce dá-nos uma forma limpa de fazer exatamente isso, e vamos vê-la no módulo 6.

Agora a reviravolta: a escola de cães começa a aceitar gatos. O que fazemos? Uma opção: acrescentar uma tabela Gato ao lado da tabela Cão, e um Truque do gato ao lado do Truque do cão. Tudo duplica: dois de cada ecrã, dois de cada relatório, e no dia em que aceitarem coelhos, três. A outra opção: dar um passo atrás e perceber que um gato tem um dono, talvez um criador, uma raça, uma data de nascimento e, com paciência, um ou dois truques. Os mesmos factos e as mesmas relações de um cão. Por isso generalizamos: um Pet (animal de estimação), com uma Espécie, cão ou gato. Cada raça também pertence a uma espécie, e é aí que a espécie realmente vive: um labrador é um cão. O pet leva uma cópia, de propósito, para que todos os ecrãs e relatórios possam começar com «cão ou gato?» sem consultar a raça. Mais uma cópia deliberada, e no módulo 6 ganha um trabalho próprio.

Isso é projetar para a mudança, e é um trade-off. Generalize cedo demais e tudo se torna uma «Coisa» vaga com um campo de tipo que ninguém entende. Eu generalizo quando o negócio me traz de facto o segundo tipo, e os dois partilham quase tudo, como os cães e os gatos aqui. Se os gatos precisassem de factos muito diferentes, pensaria duas vezes.

O modelo dos pets depois dos trade-offs O modelo dos pets como modelo de dados detalhado. Pet fica onde estava Cão: ID do pet, também conhecido pelo número do microchip, os IDs do dono, do criador e da raça, Espécie (uma lista de opções: cão ou gato), nome, data de nascimento e uma contagem de Truques conhecidos mantida para os relatórios. Raça agora está ligada (um Pet é de uma Raça) e tem a sua própria espécie, nome e porte. Truque do pet, entre Pet e Truque, tem o nível de habilidade como lista de opções e a data em que aprendeu; Avaliação do truque, abaixo dele, tem a data, o nível de habilidade e quem avaliou. Um Dono é dono de Pets e um Criador cria-os, como antes. é dono de cria é de sabe está em é avaliado em Dono ID do dono ID DE REGISTO Nome Telefone ZIP Cidade Criador ID do criador ID DE REGISTO Nome Cidade Pet ID do pet ID DE REGISTO Número do microchip TAMBÉM CONHECIDO COMO ID do dono ID do criador ID da raça Espécie (lista de opções) Nome Data de nascimento Truques conhecidos (contagem) Raça ID da raça ID DE REGISTO Espécie (lista de opções) Nome Porte Truque do pet ID do truque do pet ID DE REGISTO ID do pet ID do truque Nível de habilidade (lista de opções) Aprendeu em Truque ID do truque ID DE REGISTO Nome Dificuldade Avaliação do truque ID da avaliação do truque ID DE REGISTO ID do truque do pet Data Nível de habilidade (lista de opções) Avaliado por exatamente um zero ou um um ou muitos zero ou muitos © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Agora os mesmos tipos de escolha na Steve Trucking, onde o que está em jogo é maior.

O modelo mais limpo nem sempre é o melhor sistema

Seção intitulada “O modelo mais limpo nem sempre é o melhor sistema ”

Imagine uma equipa numa paragem. A entrega tem os seus artigos. A instalação tem uma checklist. Cada etapa precisa de fotografias. O Destinatário assina.

O modelo normalizado é lindo: Entrega → Item de entrega → Checklist de instalação → Fotografia, cada um onde pertence.

Depois sento-me com as pessoas que realmente o usam. Uma equipa fecha umas dez paragens por dia, em garagens e passeios, muitas vezes sem rede. Se o meu lindo modelo as obriga a passar por um labirinto de ecrãs e listas relacionadas para terminar uma paragem, tenho um problema de arquitetura.

O modelo de dados não é a única coisa que estamos a projetar.

Estamos a projetar um sistema.

Este é um dos motivos pelos quais às vezes me afasto de um modelo perfeitamente normalizado: experiência do utilizador.

Talvez um conceito pudesse tecnicamente ser uma entidade própria, mas separá-lo acrescenta uma complexidade que traz pouquíssimo valor. Talvez um pai com vários níveis de filhos seja academicamente limpo, mas um sofrimento para preencher e manter. Talvez o conceito seja pequeno, estável e usado quase só como seleção.

É aqui que deixo de perguntar só «Onde pertence este facto em teoria?» e começo a perguntar «Como vai este sistema ser realmente usado?»

Isso não significa que cada queixa sobre um clique a mais achate o modelo. Significa que a usabilidade é uma entrada legítima da arquitetura.

Os relatórios são outro motivo comum.

Cada Parceiro retalhista quer um scorecard: entregas dentro do prazo por região, por mês. No modelo limpo, uma entrega conhece o seu centro de distribuição, e o CD conhece a sua região. Tecnicamente, conseguimos navegar por isso.

Mas a ferramenta de relatórios consegue? As pessoas que fazem os seus próprios relatórios conseguem? Conseguem responder à pergunta sem uma arquitetura de relatórios mais complicada do que a própria pergunta?

É aí que posso copiar ou derivar a região para a entrega, mais perto de onde é consumida.

Agora introduzi duplicação. Então preciso de outra pergunta: quem é dono da verdade?

Se o valor de origem muda, o que acontece à minha cópia? Deve mudar? Ou deve manter o que era verdade quando a entrega aconteceu? São requisitos diferentes.

A desnormalização não elimina a complexidade.

Desloca-a.

Eis um exemplo menor que os administradores Salesforce encontram constantemente. O utilizador precisa de escolher entre um conjunto de valores. Crio outra entidade e relaciono-me com ela, ou uso uma lista de opções?

Pegue no estado de uma entrega: agendada, carregada, saiu para entrega, a chegar, entregue, instalada, exceção, devolvida. Uma lista curta e estável de rótulos. Uma lista de opções é exatamente o que quero.

Agora pegue no tipo de paragem: só entrega, entrega com instalação, entrega com recolha. Esse carrega informação própria: quanto tempo a paragem leva, que competências a equipa tem de ter, que checklist de instalação se aplica. Muda de forma independente, e é o negócio que o gere. Isso é uma entidade, não um rótulo.

Se crio um objeto para cada conceito que em teoria poderia ser normalizado, posso construir um sistema tecnicamente lindo que ninguém gosta de usar. Se transformo cada conceito numa lista de opções porque é fácil, posso ficar encurralado muito depressa.

Por isso pergunto: tem informação própria? Relações? Muda de forma independente? Precisa de ser gerido como dado? Poderá o negócio um dia precisar dele de mais do que um rótulo?

Eis as perguntas que realmente faço numa sessão de design.

Há mais do que uma coluna de informação? Se o valor precisa de uma descrição, uma duração, uma lista de competências, um responsável, já não é um rótulo.

Quantos valores? A minha regra prática é uns 20. Passados os 20 valores, uma lista de opções começa a descambar, e é altura de pensar num objeto. Os estados americanos, cinquenta, são a exceção com que convivemos, e os países são piores; sinceramente, alguém adora listas de opções de países? Eu acho-as irritantes.

Os valores são criados ao longo do tempo, e por quem? Acrescentar um valor de lista de opções é uma mudança de configuração, o que significa um administrador. Se o negócio acrescenta valores todas as semanas, e as pessoas que os acrescentam não são administradores, uma lista de opções põe um pedido de suporte à frente de cada valor novo.

As pessoas precisam de filtrar e fazer relatórios por ele? As listas de opções são ótimas para isso. As relações de pesquisa não são tão limpas. Cada relação de pesquisa acrescenta um salto: um tipo de relatório segue só uma cadeia curta de objetos relacionados (um tipo de relatório personalizado permite no máximo quatro relações entre objetos), o ecrã passa a ter listas relacionadas dentro de listas relacionadas, e o código fica mais complicado.

Uma lista de valores muitas vezes nasce como lista de opções e, com o tempo, conquista o direito a um objeto próprio. Deixe-a conquistá-lo.

Rótulo ou entidade? O estado e o tipo de paragem Dois cartões. Estado da entrega, uma lista de opções: oito valores estáveis, cada um uma palavra só ou uma palavra com hífen (Agendada, Carregada, Saiu-para-entrega, A-chegar, Entregue, Instalada, Exceção, Devolvida), e cada um é só um rótulo. Tipo de paragem, uma entidade: vinte e quatro valores e a crescer, como só entrega, entrega mais instalação de uma máquina de lavar ou de um fogão a gás, entrega mais recolha, só recolha, recolha de devolução e mais dezoito; cada um tem a sua própria duração da paragem, competências da equipa e checklist de instalação. Uma nota em baixo: passou de uns 20 valores, ou tem atributos próprios, é uma entidade, não um rótulo. Estado da entrega uma lista de opções OS VALORES: 8, E ESTÁVEIS Agendada Carregada Saiu-para-entrega A-chegar Entregue Instalada Exceção Devolvida CADA VALOR É Só um rótulo Tipo de paragem uma entidade OS VALORES: 24, E A CRESCER Só entrega Entrega + instalação: máquina de lavar Entrega + instalação: fogão a gás Entrega + recolha Só recolha Recolha de devolução …e mais 18 CADA VALOR TEM A SUA PRÓPRIA Duração da paragem Competências da equipa Checklist de instalação Passou de uns 20 valores, ou tem atributos próprios: é uma entidade, não um rótulo. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Um design que funciona lindamente com alguns milhares de registos pode comportar-se de forma muito diferente com milhões.

Por isso não olhe só para o diagrama. Conheça os números.

A Steve Trucking faz cerca de um milhão de entregas por ano, a crescer 30% ao ano. Cada entrega acumula umas oito atualizações de estado. São oito milhões de registos de estado este ano, e cerca de 13,5 milhões por ano no terceiro ano. Some quatro ou cinco milhões de fotografias por ano.

O mesmo modelo. Uma arquitetura muito diferente.

Vamos muito mais a fundo em Architecting at Scale (arquitetar à escala). Por agora, lembre-se: o volume pode mudar uma decisão de modelação de dados. Uma relação logicamente correta não é automaticamente o melhor design físico a qualquer escala.

Até aqui pensámos no sistema operacional. Os coordenadores planeiam as rotas das entregas. As equipas fecham paragens. O sistema muda à medida que o negócio funciona.

Mas o negócio também quer analisar anos de histórico. Que parceiros e regiões se atrasam? Como mudou o tempo de entrega? Com que frequência as instalações precisam de uma segunda visita?

Um sistema analítico pode querer as mesmas informações organizadas de outra forma. Vai ouvir termos como data warehouse, facto, dimensão e esquema em estrela. Não os vamos destrinçar aqui; na Steve Trucking esse é o data warehouse no Snowflake, e vamos voltar a ele mais adiante no curso.

Por agora: consumidores diferentes podem precisar de formas diferentes da mesma verdade.

E agora há outro consumidor: a IA.

Um Destinatário envia uma mensagem: «Onde está a minha entrega?» Um assistente de IA poderia consultar isto:

Entrega 10427, Rota 3312, Paragem 7, Camião 117, Janela 13:00–15:00.

Uma aplicação tradicional fica perfeitamente satisfeita a seguir estas relações. Mas, para responder ao Destinatário, o assistente precisa de contexto montado a partir de vários lugares:

A sua máquina de lavar loiça da Redrock é a sétima paragem da rota de hoje que sai do centro de distribuição de Phoenix. O camião está a três paragens de distância, e ainda está dentro da sua janela das 13h às 15h.

Pegamos informações de várias entidades relacionadas e montamos uma representação mais plana e rica em contexto para um consumidor específico.

Isso não significa que eu destrua o meu modelo normalizado. E com certeza não significa «a IA gosta de dados planos, por isso ponha tudo num único objeto gigante». Não faça isso.

A fonte da verdade continua limpa. A IA recebe uma representação construída para o trabalho que está a fazer. É a mesma ideia que acabámos de ver com a análise:

Uma fonte da verdade pode sustentar várias formas de consumo.

Vamos muito mais a fundo em grounding e recuperação mais adiante no curso.

Há um perigo aqui.

Se copio a região para a entrega por causa dos relatórios, envio uma versão achatada para o Snowflake e construo uma versão rica em contexto para o assistente de IA, qual delas está correta?

Essa pergunta precisa de resposta. Quero saber onde vive o valor com autoridade. Tudo o resto é uma representação dessa verdade com um propósito.

Esse lugar é o sistema de registo. As cópias desnormalizadas podem ser boas: o ecrã da paragem, o scorecard, o Snowflake e o contexto da IA fazem cada um melhor o seu trabalho com uma forma construída para eles, e consultá-las não tem problema. Mas, quando algo muda, a mudança começa no sistema de registo, tipicamente o modelo relacional, e flui para fora, para cada cópia. Ninguém corrige a região no Snowflake, nem edita à mão o contexto da IA. Corrija na origem, e deixe a mudança fluir.

O sistema de registo: a mudança flui para fora Uma caixa no alto, o sistema de registo, relacional, onde as mudanças começam, com setas a descer para quatro cópias construídas a partir dele: o ecrã de paragem da equipa, com uma paragem toda numa página; o scorecard do parceiro, com as entregas atrasadas por região; o data warehouse no Snowflake, com anos de histórico; e o contexto de entrega da IA, para «Onde está a minha entrega?». Uma nota em baixo: a mudança começa no sistema de registo e flui para cada cópia; nunca corrija uma cópia. O sistema de registo relacional: as mudanças começam aqui Ecrã de paragem da equipa uma paragem, tudo numa página Scorecard do parceiro entregas atrasadas por região Data warehouse no Snowflake anos de histórico Contexto de entrega da IA «Onde está a minha entrega?» A mudança começa no sistema de registo e flui para cada cópia. Nunca corrija uma cópia. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

E isto importa mais quando os dados mudam. Se um centro de distribuição passa hoje para outra região, as entregas do mês passado devem mostrar a nova região? Talvez. Talvez não. Para o histórico, posso precisar da região que era verdade quando a entrega aconteceu. Isso já não é um problema de sincronização. É uma decisão de negócio.

É por isso que a desnormalização nunca deve acontecer por acidente. Cada facto duplicado levanta perguntas sobre propriedade, sincronização, histórico e confiança. É o raciocínio de trade-offs do capítulo 1: saiba o que está a comprar (um ecrã mais fácil, um relatório mais simples, um contexto melhor para a IA) e o que está a pagar (dados duplicados, sincronização, uma propriedade da verdade mais complicada). E, como partimos de um modelo lógico limpo, podemos apontar para cada cópia e dizer: «Sei que isto pertence ali. Estou a pôr uma representação aqui por causa deste requisito.» É uma decisão que podemos rever, questionar e registar, para que o próximo arquiteto saiba porquê.

Quando estou a considerar desnormalizar, estou a decidir:

  • Onde vive a fonte com autoridade de cada fato de negócio.
  • Se o modelo limpo cria problemas reais para utilizadores, relatórios, escala ou desempenho.
  • Se uma representação mais simples compensa a duplicação, e como a cópia se mantém fiável.
  • Se os valores históricos devem mudar quando a fonte atual muda.
  • Se a análise ou a IA precisam de uma forma dos dados diferente da do sistema operacional.

O ponto de partida nunca muda: saiba onde pertence a verdade. Depois, quando os requisitos o justificarem, dê-lhe uma forma para a entrega.

A seguir, o Salesforce volta ao quadro. Vamos transformar o que projetámos num modelo de dados físico.