2011-12-16 16 views
5

En todas las aplicaciones que he hecho donde se usa una base de datos, generalmente almaceno el valor calculado junto con las variables necesarias para calcular ese valor. Por ejemplo, si tengo tonnage y cost, los multiplicaría para calcular el total. Podría recalcular el valor cada vez que sea necesario, solo me preguntaba si había un enfoque estándar. De cualquier manera, está bien conmigo, solo quiero hacer lo que es más común.¿Debo almacenar un valor de cálculo en mi base de datos junto con las variables?

Si almaceno las variables de cálculo hace que mis clases de dominio sean un poco más complejas, pero hace que mi lógica de controlador sea más limpia, si no almaceno las variables calculadas, es al revés.

Los cálculos no serían extremadamente frecuentes, pero pueden ser moderadamente frecuentes, pero la matemática es barata ¿no?

Respuesta

7

El enfoque estándar no es almacenar este tipo de valores calculados: rompe la normalización.

Hay casos en los que desea almacenar valores calculados, si lleva demasiado tiempo volver a calcular, o si está ejecutando un depósito de datos, etc. En su caso, debe apegarse a las reglas de normalización.

1

En mi experiencia, lo más común es a) almacenar el valor calculado, b) sin restricciones CHECK en la base de datos que garanticen que el valor sea correcto.

El derecho que hay que hacer es o bien

  • No guarde el resultado del cálculo
  • tienda el valor calculado en una columna que se validó con una restricción CHECK.

MySQL no admite restricciones CHECK. Así sus opciones son

  • No guarde el resultado del cálculo
  • cambiar a un DBMS que soporta restricciones CHECK, como PostgreSQL.
0

La matemática simple es relativamente económica, sin embargo, debe tener en cuenta el costo de almacenamiento adicional frente al ahorro de rendimiento al almacenar estos valores. Otra cosa que quizás quiera considerar es el efecto que esto tendrá en las actualizaciones de datos, donde simplemente no puede actualizar el valor del campo, también necesita actualizar el valor calculado.

1

Todo depende de qué recursos son escasos en su entorno. Si calcula previamente el valor, ahorrará tiempo de CPU a costa de un mayor uso de la red y espacio de almacenamiento de base de datos. En estos días, el tiempo de CPU generalmente es mucho más abundante que el ancho de banda de red y el almacenamiento de DB, así que voy a adivinar que, siempre que el cálculo no sea demasiado complicado, no vale la pena calcular previamente el valor.

Por otro lado, quizás el valor que está calculando requiere una cantidad considerable de CPU. En este caso, es posible que desee almacenar en caché ese valor en el DB.

Por lo tanto, depende de lo que tiene y lo que le falta.

3

Esto viola la forma normal para tener este valor calculado.A menos que exista un motivo para desnormalizar (generalmente restricciones de rendimiento), debe hacer todos los esfuerzos por normalizar sus tablas, hará que su base de datos sea mucho más fácil de mantener/mejorar y la desnormalización puede encerrarlo en un diseño que es difícil de alterar fácilmente y expone sus datos a incoherencias y redundancia.

Cuestiones relacionadas