Existem diretrizes ou regras práticas para determinar quando armazenar valores agregados e quando calculá-los em tempo real?
Por exemplo, suponha que eu tenha widgets que os usuários possam avaliar (consulte o esquema abaixo). Cada vez que mostro um widget, posso calcular a classificação média do usuário a partir da Ratings
tabela. Como alternativa, eu poderia armazenar a classificação média na Widget
mesa. Isso me pouparia de ter que calcular a classificação toda vez que eu exibir o widget, mas teria que recalcular a classificação média cada vez que um usuário classificasse um widget.
Ratings Widgets
--------- -------
widget_id widget_id
user_id name
rating avg_rating <--- The column in question
Com que frequência você precisa calcular / exibir os valores em relação à frequência com que os números subjacentes são alterados / atualizados.
Portanto, se você tem um site com 10 mil acessos diários que exibe um valor que muda apenas uma vez por hora, eu o calcularia quando os valores subjacentes mudarem (pode ser um gatilho de banco de dados, o que seja).
Se você tiver uma ferramenta para analisar as estatísticas, onde as estatísticas estão mudando a cada segundo, mas você apenas três pessoas tiverem acesso, e elas apenas a visualizarão algumas vezes por dia, seria mais provável que eu calculasse na mosca. (a menos que demore alguns minutos para calcular que ter dados obsoletos em primeiro lugar não é grande coisa ... e meu chefe me diz para gerar a coisa do cron a cada hora, para que ele não tenha esperar quando ele quiser dar uma olhada.)
fonte
Use a tabela StaleWidgets como uma fila de widgets "inválidos" (a serem recalculados). Use outra tarefa de encadeamento (assíncrona) que possa recalcular esses valores. O período ou momento dos recálculos depende dos requisitos do sistema:
fonte
Eu sugeriria o cálculo em tempo real se o cálculo não for muito complicado e, no caso de você ter uma cálculo complexo e uma atualização frequente, mas não a leitura de frequnet, você poderá armazenar dados calculados e ter uma coluna extra (bool) que armazenará se o recálculo é necessário ou não . por exemplo, defina esta coluna como true sempre que o recálculo for feito, mas não faça o recálculo e, quando você fizer o recálculo, defina esta coluna como falsa (isso representará que o valor calculado é o mais recente e não obsoleto).
Dessa forma, você não precisa recalcular todas as vezes, apenas calculará quando precisar ler e o valor da coluna de recálculo for verdadeiro. Dessa forma, você economizará muito recálculo.
fonte
Para o caso em particular, existe uma solução diferente em que você não precisa adicionar todas as classificações e dividi-las pelo total para encontrar a média. Em vez disso, você pode ter um outro campo que contém o total de revisões, portanto, toda vez que você adiciona uma classificação, calcula a nova média usando (avg_rating × total + new_rating) / total, isso é muito mais rápido que o agregado e reduz as leituras de disco desde que você não precisa acessar todos os valores de classificação. Soluções semelhantes podem se aplicar a outros casos.
A desvantagem disso é que não se trata de uma transação ácida; portanto, você pode terminar com uma classificação desatualizada. Mas ainda assim você pode resolver isso usando gatilhos no banco de dados. O outro problema é que o banco de dados não é mais normalizado, mas não tenha medo de desnormalizar os dados em troca do desempenho.
fonte