Quiero pedirle su opinión sobre el uso de disparadores o transacciones de MySQL en un sitio web.
En realidad tengo una payment
tabla de historial con - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. Por lo tanto, cada operación de pago se inserta en esta tabla.
Sin embargo, llevará mucho tiempo calcular cada vez que el monto total del crédito del usuario cada vez que realice una acción. Así que pensé que tal vez sea una buena idea mantener el monto total del crédito para cada usuario en una profile
tabla de usuarios .
Aquí está el problema. ¿Cómo puedo estar seguro de que el monto total del crédito de la profile
tabla permanecerá sincronizado con las operaciones de la payment
tabla del historial?
Pensé usar 2 métodos:
- MySQL disparadores o
- transacciones codificadas en el código fuente
¿Cuál es más confiable? ¿Qué sucede si tengo una base de datos grande (más de 100.000 usuarios)?
¿Tienes alguna sugerencia para hacer esto?
El motor BD MySQL es InnoDB.
fuente
Buena respuesta de Rolando.
Además, los disparadores no deben usarse para la lógica, porque un par de disparadores interrelacionados más tarde, las cosas se volverán confusas rápidamente. Un buen conjunto de instrucciones en un procedimiento almacenado o en un procedimiento del lado del cliente puede transmitir la lógica empresarial con mayor claridad que un montón de lógica oculta en la base de datos. También hay limitaciones en los desencadenantes con respecto a la tabla desde la que se desencadenan, por lo que puede encontrarse dividiendo su lógica en dos lugares diferentes.
Además, puede encontrar formas de optimizar en qué momento estos cálculos suceden en su servidor de lógica de negocios, mientras que un disparador se disparará cada vez. Te encontrarás apagando el gatillo, actualizando la tabla y luego volviendo a habilitar el gatillo, lo que también significa que debes poner la lógica del gatillo en ese código.
Además, no es necesario que tenga toda la lógica en la parte de lógica de negocios del código, es posible que desee aplicar la integridad de la tabla mediante el uso de procedimientos almacenados. Esto puede iniciar una transacción, realizar múltiples actualizaciones y hacer que las cosas retrocedan muy bien si algo falla. De esa manera, alguien que mira la base de datos puede ver la lógica para insertar un pedido, por ejemplo. Esto es menos importante en el mundo actual, ya que los servicios web pueden ser la interfaz de acceso único a la base de datos; pero en el caso de que varios ejecutables tengan acceso a la base de datos, esto puede ser enorme.
Además, de todas formas tendrá transacciones, no ejecutará sus disparadores sin uno ... ¿verdad? Por lo tanto, es bueno saber cómo iniciar una transacción; hacer algunas cosas y luego finalizar una transacción. Si ve este patrón en su código, una pieza más de código que lo use será ligero en la carga cognitiva. Un disparador, si recuerda que está allí, lo obligará a pensar de manera diferente para aquellas transacciones que se ven afectadas por el disparador, especialmente si se extraen otras tablas que también pueden tener disparadores.
Básicamente, entre un trabajo cron programado regularmente (o trabajo de agente de base de datos) y buenos procedimientos almacenados, puede lograr el 99% de lo que desea. El 1%; repensar el proyecto.
fuente