Digamos que eu tenha uma product
tabela com as seguintes colunas:
product
--------
product_id
name
E tenho outra tabela para registrar a transação (ENTRADA/SAÍDA) de cada produto
product_transaction
--------------------
transaction_id
transaction_date
product_id
type
quantity
Eu quero ter uma página que lista isso product
com seus detalhes, incluindo a quantidade atual. Ao mesmo tempo, também quero uma página que liste todas as transações em um dia (ou um intervalo de datas) que também inclua o total atual da transação atual.
Minha pergunta é, devo armazenar o total corrente na product_transaction
tabela e a quantidade atual na product
tabela. Ou é rápido o suficiente para apenas calculá-los na hora?
Como muitas coisas, a resposta para essa pergunta é "depende". Nesse caso, o que depende é de quantas transações cada produto receberá.
Com volumes de transações baixos a moderados, será muito rápido calcular o total em tempo real e você não precisará escrever muito código para calcular, armazenar e manter os totais.
Indexe sua tabela!
Certifique-se de ter um índice ativado (ou começando com)
production_transaction.product_id
para que você possa recuperar rapidamente todas as transações de um determinado produto.Um índice na combinação de
product_id, transaction_date
e uma consulta especificando product_id e um intervalo de datas (ou >= hoje) fornecerá as transações de um dia para um determinado produto e com bom desempenho.Teste!
Certifique-se de testar isso em seu ambiente de teste/perguntas e respostas! Gere cargas de transação representativas, mas também cargas muito maiores para ver como será o desempenho nos casos esperados e inesperados.
Mesmo em altos níveis de transação, você terá que avaliar o desempenho associado à atualização e armazenamento dos totais em execução versus a frequência com que são consultados.
Na verdade, caso existam índices corretos, você receberá os dados calculados em um tempo relativamente pequeno. Nesse caso, você não precisa executar as manipulações de dados relevantes para o armazenamento de somas correntes e assim por diante. Os índices aumentarão o tempo de inserção, mas a influência será muito pequena (quase leve). Por exemplo, se o índice clusterizado (não precisa ser a chave primária) no
product_transaction
for criado (notransaction_date
campo) você receberá muito rapidamente a tela das transações para o intervalo de datas necessário. O índice adicional (na mesma tabela, mas arquivadoproduct_id
com a inclusão daquantity
coluna) ajudará a retornar rapidamente todas as quantidades necessáriasproduct's
.A desvantagem de armazenar o total atual e a quantidade atual é o armazenamento e o bloqueio potencial, em oposição a tempos de resposta mais rápidos ao recuperar os dados. Você deve pesar esses fatores e decidir o que é mais caro para você. Na maioria dos casos, será mais benéfico armazená-los para obter melhores tempos de resposta ao recuperar os dados, mas há casos em que não é o caso.