Conceitos
Modelagem de dados guiada pelos padrões de acesso
Intuição
Pense em como organizar uma biblioteca: antes de decidir onde cada livro fica, você pergunta quais perguntas os visitantes mais vão fazer. Se quase todo mundo pergunta 'quais são os últimos livros que eu peguei emprestado', vale manter uma ficha por empréstimo, já com o título anotado, em vez de mandar o visitante conferir o catálogo geral a cada linha. Duas perguntas ajudam: 'quais telas e consultas o sistema precisa responder?' e, para cada informação mostrada, 'ela é a de hoje ou a do momento em que o fato aconteceu?'. O desenho dos dados nasce das respostas, não de um diagrama abstrato.
Como funciona
O ponto de partida é listar os padrões de acesso: as leituras e escritas que o sistema faz, com a frequência de cada uma. A normalização (formas normais de Codd) guarda cada fato em um só lugar e liga as tabelas por chaves; isso evita anomalias de atualização, mas uma leitura pode exigir junções. A desnormalização grava uma cópia do dado junto de quem o lê, o que encurta a leitura ao custo de mais espaço e de ter que manter a cópia coerente. Dentro de um mesmo banco, a chave primária identifica a linha e a chave estrangeira garante a referência; entre bancos de serviços diferentes não existe chave estrangeira nem junção, então a referência é só um identificador guardado, e buscar um valor do outro lado é uma chamada de rede por item ou por lote. O índice é escolhido a partir da consulta de leitura: para 'itens de um cliente, mais recentes primeiro', uma chave composta por cliente e data, em ordem decrescente, lê só o trecho necessário em vez de varrer a tabela inteira. Para cada valor exibido, decide-se entre gravar o valor da época do evento (por exemplo, o preço pago, copiado no item do pedido no momento da compra) ou referenciar o valor atual. O valor da época nunca precisa ser atualizado, porque descreve um fato passado que não muda; já uma cópia que deve acompanhar a origem (como um nome de produto que precisa refletir o catálogo) gera amplificação de escrita: cada mudança na origem obriga a atualizar todas as linhas copiadas, e o custo é mudanças por dia multiplicado pelo número de linhas afetadas por mudança. A escolha entre copiar e referenciar se justifica com essa conta, comparada com a capacidade do banco e com o orçamento de tempo da tela. O paper do Dynamo registra a mesma lógica no extremo: os serviços da Amazon precisavam apenas de acesso chave-valor pela chave primária, sem o modelo relacional completo nem consultas complexas, e por isso a chave tem de ser desenhada para a leitura que se quer fazer.
Na prática
Em bancos no estilo Dynamo, como o DynamoDB, a documentação da AWS recomenda explicitamente modelar a partir dos padrões de acesso: primeiro as consultas, depois a chave de partição, a chave de ordenação e os índices secundários que as atendem, aceitando dados repetidos. Em bancos relacionais, o material clássico sobre formas normais (Codd) e sobre quando desnormalizar por desempenho de leitura faz a mesma pergunta por outro caminho. Na prática, você grava o valor da época em histórico, faturas e pedidos, e referencia o valor atual quando a tela precisa mostrar o dado corrente e a cópia teria de seguir uma origem que muda com frequência; se as mudanças na origem crescem a ponto de a atualização das cópias pesar no banco, é o sinal para trocar a cópia por uma referência.
Use em um desenho
Pratique na escola de System Design os casos que dependem deste conceito.