Je veux vous demander votre avis sur l'utilisation de déclencheurs ou de transactions MySQL dans un site Web.
En fait, j'ai une payment
table d' historique avec - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. Ainsi, chaque opération de paiement est insérée dans ce tableau.
Cependant, il faudra beaucoup de temps pour calculer le montant total du crédit de l'utilisateur à chaque fois qu'il fait une action. J'ai donc pensé que c'était peut-être une bonne idée de conserver le montant total du crédit pour chaque utilisateur dans une profile
table d' utilisateurs .
Voici le problème. Comment puis-je être sûr que le montant total du crédit de la profile
table restera synchronisé avec les opérations de la payment
table d'historique?
J'ai pensé en utilisant 2 méthodes:
- Déclencheurs MySQL ou
- transactions codées dans le code source
Quel est le plus fiable? Et si j'ai une grande base de données (plus de 100 000 utilisateurs)?
Avez-vous des suggestions pour ce faire?
Le moteur BD MySQL est InnoDB.
la source
Bonne réponse de Rolando.
De plus - les déclencheurs ne doivent pas être utilisés pour la logique, car quelques déclencheurs interreliés plus tard, les choses deviendront rapidement confuses. Un bel ensemble d'instructions dans une procédure stockée ou une procédure côté client peut traverser la logique métier plus clairement qu'un tas de logique cachée dans la base de données. Il existe également des limitations sur les déclencheurs en ce qui concerne la table à partir de laquelle ils sont déclenchés - vous pouvez donc vous retrouver à diviser votre logique en deux endroits différents.
De plus, vous pouvez trouver des moyens d'optimiser à quel moment ces calculs se produisent dans votre serveur de logique métier, alors qu'un déclencheur va se déclencher à chaque fois. Vous vous retrouverez à désactiver le déclencheur, à mettre à jour la table, puis à réactiver le déclencheur - ce qui signifie également que vous devez mettre la logique du déclencheur dans ce code.
De plus - vous n'avez pas besoin de disposer de toute la logique dans la partie logique métier du code - vous souhaiterez peut-être appliquer l'intégrité de la table à l'aide de procédures stockées. Cela peut démarrer une transaction, effectuer vos multiples mises à jour et faire en sorte que les choses se déroulent correctement en cas d'échec. De cette façon, quelqu'un qui regarde la base de données peut voir la logique pour insérer une commande, par exemple. Ceci est moins important dans le monde d'aujourd'hui car les services Web peuvent être l'interface d'accès unique à la base de données; mais dans le cas où plusieurs exécutables ont accès à la base de données, cela peut être énorme.
De plus - vous allez quand même avoir des transactions - vous n'allez pas exécuter vos déclencheurs sans un ... non? Il est donc bon de savoir comment démarrer une transaction; faire des trucs; puis terminer une transaction. Si vous voyez ce modèle dans votre code, un morceau de code supplémentaire qui l'utilisera sera léger sur la charge cognitive. Un déclencheur, si vous vous souvenez qu'il existe, vous obligera à penser différemment pour les transactions qui sont affectées par le déclencheur, en particulier si d'autres tables sont extraites qui peuvent également avoir des déclencheurs.
Fondamentalement, entre un travail périodique planifié (ou un travail d'agent de base de données) et de bonnes procédures stockées, vous pouvez accomplir 99% de ce que vous voulez. Le 1%; repenser le projet.
la source