Je veux demander à votre opinion à l'aide des déclencheurs ou des transactions MySQL sur un site Web.
En fait, j'ai une histoire payment
table avec - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. Donc, chaque opération de paiement est insérée dans ce tableau.
Cependant, il faudra prendre du temps le temps en calculant chaque fois le montant total du crédit de l'utilisateur à chaque fois qu'il effectue une action. Je pensais donc peut-être une bonne idée de conserver le montant total de crédit pour chaque utilisateur dans un utilisateur profile
table.
Voici le problème. Comment puis-je être sûr que le montant total du crédit forme la table profile
_ reste synchronisé avec les opérations de payment
table d'historique?
Je pensais utiliser 2 méthodes:
Qui est plus fiable? Et si j'ai une grande base de données (plus de 100 000 utilisateurs)?
Avez-vous des suggestions pour faire cela?
Le moteur BD MySQL est InnoDB.
Sans aucun doute, je voudrais exclure des déclencheurs et resterais strictement avec des transactions.
Les déclencheurs sont, par nature, des procédures stockées. Leurs actions sont pratiquement difficiles à renvoyer . Même si toutes les tables sous-jacentes sont InnoDB, vous rencontrerez un volume proportionnel de verrous partagées de rangée et d'intermittence gênant à partir de serrures exclusives en rangée. Tel serait le cas si les déclencheurs manipulent des tables avec Les insertions et les mises à jour étant stagnées pour effectuer des mvcc robustes à l'intérieur de chaque appel à une gâchette .
Combinez cela avec le fait que Protocoles de validation de données appropriés ne sont pas implémentés dans la langue de la procédure stockée de MySQL . Business Intelligence est correct d'avoir contenue dans une base de données à condition que la langue de procédure stockée puisse gérer un environnement transactionnel . En tant que dba mysql, je dois dire honnêtement que tel n'est pas le cas avec MySQL. Oracle (PL/SQL), PostgreSQL (PL/PGSQL) et SQL Server (T-SQL) ont ce bord sur MySQL.
En ce qui concerne les transactions, MySQL a InnoDB comme principal moteur de stockage compatible aux acides (moteur de stockage de SURMULT dans MySQL 5.5). Il a une excellente récupération d'accident et obéit les protocoles de conformité aux acides.
Je choisirais des transacitons sur des déclencheurs à chaque fois.
Je suis d'accord avec l'évaluation de Rolando. Votre logique d'entreprise devrait résider dans votre demande et apporter des modifications à la base de données transactionnellement.
La mise à l'échelle à 100 000 utilisateurs dépend bien sûr de votre application et du trafic de base de données qu'il génère. Avec MySQL sous une charge de billets transactionnels lourds, vous pourriez être rapidement confronté à la fardeau de Sharding et/ou à reproduire votre jeu de données afin de maintenir une réponse de l'application acceptable.
Cependant, il existe des alternatives à Sharding MySQL. L'un d'entre eux est Clustrix (mon employeur) qui est un système de base de données SQL à instance mono-performance haute performance à haute performance. C'est un système de base de données en cluster qui se présente comme un seul serveur MySQL. La mise à l'échelle de la base de données décrite dans ce fil de manière transparente à 100 000 utilisateurs sur une seule instance de Clustrix ne nécessiterait aucun frisson et aucune logique d'application supplémentaire.
Bonne réponse de Rolando.
De plus, les déclencheurs ne doivent pas être utilisés pour la logique, car un couple de déclencheurs inter-relativement plus tard, les choses vont être confuses rapidement. Un bon ensemble d'instructions dans une procédure stockée ou une procédure latérale du client peut accéder plus clairement à la logique commerciale 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 qu'ils sont déclenchées - de sorte que vous vous retrouvez ainsi fractionnez votre logique dans deux endroits différents.
De plus, vous trouverez peut-être des moyens d'optimiser à quel point ces calculs se produisent dans votre serveur logique professionnel, alors qu'un déclencheur va se déclencher à chaque fois. Vous vous retrouverez à éteindre la gâchette, à la mise à jour de la table, puis à réactiver la gâchette - ce qui signifie également que vous devez mettre la logique de déclenchement dans que code.
En outre, vous n'avez pas besoin d'avoir toute la logique de la partie logique de l'entreprise 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, faire vos multiples mises à jour et faire rouler des choses bien si quelque chose échoue. De cette façon, une personne qui regarde la base de données peut voir la logique pour insérer une commande, par exemple. Cela est moins important dans le monde actuel depuis que les services Web peuvent être l'interface d'accès unique à la DB; Mais dans le cas où plusieurs exécutables ont accès à la DB, cela peut être énorme.
De plus, vous allez avoir des transactions quand même - vous n'allez pas exécuter vos déclencheurs sans une ... non? Il est donc bon de savoir comment démarrer une transaction; faire des choses; puis mettre fin à une transaction. Si vous voyez ce modèle dans votre code, une pièce de code supplémentaire qui l'utilise sera la lumière sur la charge cognitive. Un déclencheur, si vous vous rappelez que c'était là, vous vous obligerez à penser différemment pour ces transactions affectées par la gâchette, en particulier si d'autres tables sont tirées également pourraient avoir des déclencheurs.
Fondamentalement, entre un travail de travail cron (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.