Es kommt vor, dass wir Daten priorisieren müssen um maximale Performance zu gewährleisten. Nehmen wir beispielsweise eine Auktionsplattform mit Auktionen und Geboten. Auf die laufenden Auktionen werden die meisten Zugriffe erfolgen, und hier bedeutet eine kleine Datenmenge schnelle Datenbankzugriffe.

Naheliegend ist, laufende Auktionen und abgelaufene Auktionen in separaten Tabellen zu halten. Also eine Archivierung der weniger wichtigen Daten, um die wichtigen Daten zu favorisieren.

laufende Auktionen

  • auction
  • auctionbid

abgelaufene Auktionen

  • arc_auction
  • arc_auctionbid

MySQLs InnoDB bietet Features, um den Archivierungprozess zu erleichtern.

Beziehungen

ON DELETE CASCADE auf dem auctionbid.auction Fremdschlüssel würde bewirken, dass beim Löschen einer Auktion alle zugehörigen Gebote gelöscht werden.

Man könnte meinen, man müsse nun nur für auction und auctionbid DELETE-Trigger erstellen, die die Daten in die Archiv-Tabellen schreiben. Das funktioniert aber nicht, da ein beziehungsbedingtes Löschen keinen DELETE-Trigger auslöst.

Trigger

Zunächst erstellen wir den Trigger, der bei Löschung die Auktion im Auktions-Archiv erstellt. In der letzten Zeile wird der DELETE auf auctionbid ausgeführt, der per Beziehung nicht ausglöst werden würde.

auction BEFORE DELETE

BEGIN
INSERT INTO arc_auction (id, user, description, image_url, startingprice, buyoutprice, expiration, execution)
VALUES (OLD.id, OLD.user, OLD.description, OLD.image_url, OLD.startingprice, OLD.buyoutprice, OLD.expiration, OLD.execution);
DELETE FROM auctionbid WHERE auction=OLD.id;
END

Desweiteren ist ein Trigger erforderlich, der die Gebote in das Gebots-Archiv verschiebt.

auctionbid AFTER DELETE

INSERT INTO arc_auctionbid (id, auction, user, bid, ts)
VALUES (OLD.id, OLD.auction, OLD.user, OLD.bid, OLD.ts)

Dieser Automatismus in der Datenbank bietet offensichtlich Vorteile, aber auch die Nachteile wollen bedacht sein. Ein Verteilen der Business-Logik auf mehrere Komponenten, in diesem Fall Scriptengine und Datenbank, macht eine Applikation unübersichtlich. Der Script-Programmierer muss zu jeder Zeit wissen, dass die Datenbank selbständig archiviert, um nicht auf die Idee zu kommen diese Funktion per Script zu programmieren. Das könnte dort, wo Database-Engineer und Script-Programmierer nicht dieselbe Person sind und/oder fluktuieren, problematisch werden.