Ich möchte Sie um Ihre Meinung zur Verwendung von MySQL-Triggern oder -Transaktionen auf einer Website bitten.
Eigentlich habe ich eine Geschichtstabelle payment
mit - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. Daher wird jeder Zahlungsvorgang in diese Tabelle eingefügt.
Es ist jedoch zeitaufwändig, jedes Mal den Gesamtkreditbetrag des Benutzers zu berechnen, wenn er eine Aktion ausführt. Daher hielt ich es für eine gute Idee, den Gesamtkreditbetrag für jeden Benutzer in einer Benutzertabelle zu profile
speichern.
Hier ist das Problem. Wie kann ich sicher sein, dass der gesamte Kreditbetrag aus der profile
Tabelle mit den Vorgängen aus der payment
Verlaufstabelle synchronisiert bleibt ?
Ich dachte mit 2 Methoden:
- MySQL löst aus oder
- Transaktionen, die im Quellcode codiert sind
Welches ist zuverlässiger? Was ist, wenn ich eine große Datenbank habe (über 100.000 Benutzer)?
Haben Sie Vorschläge dazu?
Die BD MySQL Engine ist InnoDB.
quelle
Gute Antwort von Rolando.
Außerdem - Trigger sollten nicht für die Logik verwendet werden, da einige Dinge später zu einer Verwirrung führen, da die Dinge schnell verwirrend werden. Ein netter Satz von Anweisungen in einer gespeicherten Prozedur oder einer clientseitigen Prozedur kann die Geschäftslogik klarer vermitteln als eine Reihe versteckter Logik in der Datenbank. Es gibt auch Einschränkungen für Trigger in Bezug auf die Tabelle, von der sie ausgelöst werden. Daher können Sie feststellen, dass Sie Ihre Logik an zwei verschiedenen Stellen aufteilen.
Darüber hinaus finden Sie möglicherweise Möglichkeiten, um zu optimieren, wann diese Berechnungen in Ihrem Geschäftslogikserver stattfinden, während jedes Mal ein Auslöser ausgelöst wird. Sie werden feststellen, dass Sie den Trigger ausschalten, die Tabelle aktualisieren und dann den Trigger wieder aktivieren - was auch bedeutet, dass Sie die Triggerlogik in diesen Code einfügen müssen.
Darüber hinaus möchten Sie möglicherweise nicht die gesamte Logik im Geschäftslogikteil des Codes haben und die Tabellenintegrität mithilfe gespeicherter Prozeduren erzwingen. Dies kann eine Transaktion starten, mehrere Updates durchführen und dazu führen, dass die Dinge gut zurückgesetzt werden, wenn etwas fehlschlägt. Auf diese Weise kann jemand, der sich die Datenbank ansieht, beispielsweise die Logik zum Einfügen einer Bestellung erkennen. Dies ist in der heutigen Welt weniger wichtig, da Webdienste die einzige Zugriffsschnittstelle zur Datenbank sein können. In dem Fall, in dem mehrere ausführbare Dateien Zugriff auf die Datenbank haben, kann dies sehr groß sein.
Außerdem - Sie werden sowieso Transaktionen haben - werden Sie Ihre Trigger nicht ohne einen ausführen ... richtig? Es ist also gut zu wissen, wie man eine Transaktion startet. mach ein paar Sachen; und beenden Sie dann eine Transaktion. Wenn Sie dieses Muster in Ihrem Code sehen, wird ein weiterer Code, der es verwendet, die kognitive Belastung beeinträchtigen. Ein Trigger zwingt Sie, wenn Sie sich daran erinnern, dass er vorhanden ist, dazu, für die vom Trigger betroffenen Transaktionen anders zu denken, insbesondere wenn andere Tabellen eingezogen werden, die möglicherweise auch Trigger haben.
Grundsätzlich können Sie zwischen einem regelmäßig geplanten Cron-Job (oder einem Datenbankagenten-Job) und gut gespeicherten Prozeduren 99% der gewünschten Ergebnisse erzielen. Die 1%; Überdenken Sie das Projekt.
quelle