Domanda

Vorrei chiedere la vostra opinione in utilizzando i trigger MySQL o le operazioni in un sito web.

In realtà ho una tabella payment la storia con - UserId | OperationId | Comment | Credits | Sign (debit or credit). Così ogni operazione di pagamento si inserisce in questa tabella.

Tuttavia, sarà in termini di tempo di calcolo di volta in volta l'importo del credito totale degli utenti ogni volta che fanno l'azione. Così ho pensato che forse è una buona idea per mantenere la quantità di credito totale per ogni utente in una tabella utente profile.

Qui è il problema. Come posso essere sicuro che l'importo del credito totale formano il tavolo profile rimarrà sincronizzato con le operazioni dal tavolo storia payment?

Ho pensato con 2 metodi:

  • trigger MySQL o
  • le operazioni codificate nel codice sorgente

Il che è più affidabile? Cosa succede se ho grande database (oltre 100.000 utenti)?

Hai qualche suggerimento per fare questo?

Il motore BD MySQL è InnoDB.

È stato utile?

Soluzione

Senza dubbio, vorrei escludere trigger e rigorosamente rimanere con le transazioni.

trigger sono, per natura, stored procedure. Le loro azioni sono praticamente difficile rollback . Anche se tutte le tabelle sottostanti sono InnoDB, si verificherà un volume proporzionale di blocchi di riga e condivisi intermittenza fastidioso da blocchi di riga esclusivi. Tale sarebbe il caso se trigger stavano manipolando le tabelle con inserimenti e aggiornamenti in corso una fase di stagnazione per eseguire Heavy Duty MVCC all'interno di ogni chiamata a un trigger .

Combinate questo con il fatto che non sono implementate in MySQL stored procedure lingua . Business Intelligence è OK per aver contenuto in un database fornito la stored procedure lingua in grado di gestire un ambiente transazionale . Come MySQL DBA, devo dire onestamente che tale non è il caso di MySQL. Oracle (PL / SQL), PostgreSQL (PL / pgSQL), e SQL Server (T-SQL) ha questo vantaggio rispetto MySQL.

Per quanto riguarda le transazioni, MySQL ha InnoDB come motore di storage ACID-compliant (storage engine Deafult in MySQL 5.5) principale. Ha ottime crash recovery e obbedisce i protocolli di conformità ACID.

vorrei scegliere transacitons oltre trigger ogni singola volta.

Altri suggerimenti

Sono d'accordo con la valutazione di Rolando. La logica di business deve risiedere nella propria applicazione e dovrebbe apportare modifiche al database transazionale.

Scaling a 100.000 utenti, ovviamente, dipende dalla vostra base di dati del traffico che genera applicazioni e. Con MySQL sotto un carico di scrittura transazionale pesante, si potrebbe essere ben presto di fronte a oneri di sharding e / o replicare il set di dati al fine di mantenere la risposta delle applicazioni accettabile.

Tuttavia, ci sono alternative alla sharding MySQL. Uno di loro è Clustrix (il mio datore di lavoro), che è un sistema di database SQL singola istanza ad alte prestazioni in parallelo scalabile. Si tratta di un sistema di database cluster che si presenta come un unico server MySQL. Scaling il database descritto in questo thread perfettamente a 100.000 utenti su una singola istanza di Clustrix richiederebbe alcuna sharding e nessuna logica domanda supplementare.

Buona risposta da Rolando.

In aggiunta - trigger non deve essere utilizzato per la logica, perché un paio di trigger tra loro relative tardi, le cose andranno confondendo veloce. Un bel set di istruzioni in una procedura lato procedura o client memorizzato può ottenere attraverso la logica di business in modo più chiaro che un gruppo di logica nascosta nel database. Ci sono anche limitazioni trigger rispetto al tavolo ottengono innescati da - così si possono trovare te dividere la logica in due posti diversi ..

Inoltre - si potrebbe trovare il modo per ottimizzare a che punto questi calcoli avvengono nel server logica di business, mentre un trigger è intenzione di scatenare ogni singola volta. Vi ritroverete spegnendo il grilletto, l'aggiornamento della tabella, e quindi riattivare il grilletto -. Il che significa anche è necessario mettere la logica di trigger in che codice

In aggiunta - non si deve avere tutta la logica nella parte logica di business del codice - si potrebbe desiderare di far rispettare l'integrità tabella utilizzando le stored procedure. Questo può avviare una transazione, fare le vostre più aggiornamenti, e hanno cose ben rollback se qualcosa non funziona. In questo modo qualcuno guardando il database può vedere la logica per l'inserimento di un ordine, per esempio. Questo è meno importante nel mondo di oggi dal momento che i servizi web possono essere l'interfaccia di accesso singolo al db; ma nel caso in cui più eseguibili hanno accesso al DB questo può essere enorme.

Inoltre - si sono gonna avere transazioni in ogni caso - non sei intenzione di eseguire i trigger senza uno ... giusto? Quindi è bene sapere come avviare una transazione; fare alcune cose; e poi terminare una transazione. Se vedete questo modello nel codice, un altro pezzo di codice che utilizza sarà luce sul carico cognitivo. Un trigger, se si ricorda che è lì, vi costringerà a pensare in modo diverso per le operazioni che sono colpiti dal trigger, soprattutto se gli altri tavoli sono tirati in che può anche avere trigger.

In sostanza, tra un lavoro cron regolarmente programmata (o lavoro agente di database) e buona stored procedure, si può realizzare il 99% di ciò che si desidera. Il 1%; ripensare il progetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top