¿Es aceptable violar una regla de normalización a favor del desempeño?

¿Es aceptable violar una regla de normalización a favor del desempeño?

Tengo una base de datos con una tabla 'producto' en relación con una tabla 'descuento'. la tabla de descuento, a su vez, está en relación con 'marca' y 'categoría'. necesito saber el 'precio calculado' de cada producto y luego clasificarlos (alrededor de 30.000 productos). pero, de esta manera, la consulta es demasiado lenta. ¿Es aceptable violar la tercera regla de normalización y agregar 'precio calculado' como una columna en db? la columna se calculará mediante una ejecución de consulta una vez cada 5 minutos más o menos... no veo otra solución.

Mostrar la mejor respuesta

Puedes hacer lo que quieras. Sin embargo, le sugiero que vuelva a leer la justificación de esas "reglas". La razón es que si rompes las reglas, también pierdes las ventajas que obtienes de ellas.

El tema es "desnormalización". Además, su pregunta es una pregunta frecuente. Siempre busque en Google muchas versiones/frases claras, concisas y específicas de su pregunta/problema/objetivo y lea muchas respuestas. Agregue palabras clave relevantes que descubra a sus búsquedas. Si no encuentra una respuesta, publique, usando una búsqueda variante para su título y palabras clave para sus etiquetas.

Creo que depende de tu situación: por ejemplo, una vez tuve una tabla que contenía la información para generar una factura, como el precio, pero también el valor del IVA en el momento de la emisión de la factura.

El valor del IVA cambia con el tiempo, pero no puede influir en las facturas emitidas anteriormente, por lo que la única forma de evitar problemas era almacenar el valor en sí en lugar de una referencia en una tabla de "valores constantes". Esto, de hecho, produce redundancia de la información dentro de la tabla y posibles "inconsistencias" dentro de la base de datos.

Dicho esto, consideraría con mucho cuidado las razones detrás de su elección de agregar una columna (tenga en cuenta que son solo para hacerlo pensar, no para señalar con el dedo a ninguna parte :)):

  • ¿está seguro de que el rendimiento se ve afectado por un par de combinaciones de sus tablas?
  • si es así, ¿está seguro de que el problema no se encuentra en otra parte de su diseño?
  • ¿siempre necesita el valor de calculatedPrice para todos sus productos o puede reducir el número de filas, calculando solo los valores para los productos que realmente necesita?

Si su respuesta es "Sí" para todas las preguntas anteriores, vaya a la columna adicional.

P.D.: En cualquier caso, evitaría cosas como "ejecutar una consulta una vez cada 5 minutos más o menos": esto abre su sistema a problemas de sincronización y problemas de concurrencia. ¿Qué sucedería si el descuento ha cambiado, pero su "consulta de actualización" aún no se ha ejecutado? ¿Entonces su programa recuperaría un valor antiguo?