Telescope (core)
Quando desnormalizar um atributo?
ADS.FAQ-12432
A normalização é um processo da engenharia de software que diminui redundâncias e inconsistências no modelo de dados. O processo de normalização aplica uma série de regras sobre as entidades de um modelo para verificar se estas estão corretamente projetadas.
Existem, no entanto, situações de atributos cujo conteúdo é calculado em função de outros atributos e que teoricamente não precisaria ser persistido. Nestes casos, o desenvolvedor pode ficar em dúvida de como proceder:
- Criar uma função ou método que calcule o valor deste atributo lógico no momento em que ele for necessário ou
- Criar um atributo que mantenha este valor persistido fisicamente na entidade e mante-lo sempre atualizado.
Ambas opções podem ser usadas dependendo da situação. Os principais critérios a serem considerados estão descritos abaixo.
O atributo calculado pode ser utilizado como critério para filtrar um conjunto de registros?
Caso o atributo calculado seja candidato a ser utilizado para filtrar um conjunto de registros, é possível que se deseje criar um índice para acelerar esta pesquisa.
Um exemplo típico seria um atributo que indicasse a situação de um pedido, por exemplo. Este atributo poderia ser definido através de algumas condições, tipo a existência de uma data de aprovação definiria que o pedido foi aprovado, de que a quantidade entregue é igual a quantidade requisitada definiria que ele está encerrado ou que a informação de uma data de cancelamento definiria que ele está cancelado. É provável que se deseje listar os pedidos pendentes, então faz sentido criar um atributo que seja automaticamente calculado pelo modelo.
O atributo calculado é lido muito mais vezes do que seu valor alterado?
Existe um processamento para calcular o atributo. Este processamento, teoricamente, é o mesmo realizado tanto no caso dele ser persistido em um atributo físico como no caso dele ser calculado apenas no momento em que seja necessário. Então, do ponto de vista de performance, podemos decidir o que é menos oneroso para o sistema. Se a necessidade de leitura do atributo é muito mais frequente que as suas mudanças de valor, então é mais "barato" mante-lo desnormalizado.
Qual o nível de complexidade e dependências do calculo?
Caso se decida em normalizar um atributo, deve-se ter muito cuidado em mapear com exatidão as dependências/parâmetros utilizados neste cálculo.
Na forma mais simples, todos os parâmetros utilizados são outros atributos que fazem parte do mesmo registro.
Em outros casos, os parâmetros estão em outras entidades relacionadas. Neste caso, eventos nestas outras entidades devem ser mapeados de forma a notificar a entidade do atributo calculado para que ele seja atualizado.
É importante verificar se o escopo dos parâmetro é muito grande. Se a alteração de um destes parâmetros exige a notificação de vários registros, isso pode se tornar um problema.
Ver também: