Era MySQL 4.x a trecut de mult, ca să nu mai vorbesc de 3.x. Oh, ce vremuri de „pionierat”.

MySQL 5 a venit cu o gramada de bunătăți (ce existau demult în alte DBMS) și totuși, încă văd o mulțime de aplicații web care nu folosesc avantajele oferite de noua versiune. De fapt, de ce mă mir? Încă văd aplicații ce se doresc a fii serioase și folosesc tabele MyISAM. Tranzacții? Foreign keys? Prostii...cine are nevoie de ele?

Dar nu despre tranzacții și foreign keys vreau să vorbesc, ci despre triggers - o funcționalitate apărută în MySQL 5. Orice programator care a avut de-a face cu baze de date ar trebui să știe ce e un trigger, așa că nu o să explic conceptul. O să dau doar un exemplu în care un trigger poate să-ți ușureze viața. Presupunem că avem următoarele tabele:

customer customer_payments
customer_id payment_id
firstname customer_id
lastname payment_amount

Pentru a afla totalul plăților făcute de fiecare client în parte, avem un query de genul:

[code lang="sql"]select firstname, lastname, sum(payment_amount) as total_payments from customer inner join customer_payments using(customer_id) group by customer_id[/code]

Cazul cu un singur join este unul fericit și l-am luat doar pentru simplitatea exemplului. În realitate însă, query-urile de acest gen pot deveni mari consumatoare de resurse.

Putem scăpa de join-ul respectiv dacă adaugăm un câmp în tabela customer, câmp care va conține suma tuturor plăților făcute de un client. Noua tabelă va arăta așa:

customer
customer_id
firstname
lastname
total_payments

Câmpul total_payments va fi actualizat automat (cu ajutorul unui trigger, evident) la fiecare adăugare, ștergere sau modificare a unei înregistrări din tabela customer_payments.

Costul actualizării câmpului total_payments este net inferior costului unui JOIN făcut de mii de ori pe zi.

/Actualizare: poate un exemplu mai bun era cu articolele dintr-un blog și comentariile la articole.

/Actualizare 2: vreau să accentuez faptul că soluția dată mai sus trebuie aplicată doar când situația o cere, nu la fiecare join cu group by si sum()