Realizar cálculos na base de dados e enviá-los para outras tabelas é uma tarefa comum aqui na Meritt. Fazemos isso para que nossos sistema sejam rápidos no acesso aos dados.
O problema desta abordagem é que frequentemente são necessários dados calculados para diversas combinações de filtros.
Veja o Portal Ideb por exemplo, cada município tem um gráfico de Pizza mostrando qual a porcentagem de escolas em cada nível qualitativo. Além disso, este mesmo dado é diferente para anos iniciais municipal, anos finais estadual, etc.
Depois de termos feito isso muitas vezes estamos conseguindo chegar em um bom modelo utilizando procedures.
É mais ou menos assim:
- Criamos uma tabela temporária com as diversas combinações de filtros, por exemplo, anos finais municipal, anos finais estadual, anos iniciais municipal e anos finais municipal.
- Criamos uma tabela para armazenar o resultado dos cálculos;
- E fazemos uma procedure que usa um cursos para varrer a tabela temporária e criar os diversos SQLs, um para cada linha da tabela temporária (pra fazer SQL`s dinâmicos usando condicionais nas procedures, faremos outro post mais tarde);
- Dentro da mesma procedure cada SQL é executado e pronto.
Antes fazíamos os SQLS com Script PHP ou na mão mesmo.
Até funcionava, mas a chance de pequenos erros ficava muito grande, sem falar na dificuldade em executar tudo depois novamente.
Agora, é só chamar a procedure e pronto.
Para ver um modelo de uma procedure que faz esse tipo de pré-calculo, acesse aqui: Padrão de Procedure para pré-calculo de dados.