Die
Usergallerien auf
diginights.com halten die Daten für Usernamen, Userid und ersten Buchstaben des Usernamens in einer eigenen, vom Forum separaten Tabelle. Auf der Spalte ersten Buchstaben des Namens liegt ein INDEX, sodess danach schnell gesucht werden kann. Diese Vorgehensweise spart eine DB-Connection, da die Forumstabellen in einer eigenen Datenbank liegen und Symfony bzw. Propel leider nicht mehrere Datenbanken über einen
DSN handeln können.
Ein Nachteil liegt hierbei auf der Hand: Sollte im Forum ein Username geändert werden bleibt dieser ohne Eingriff in den Forumscode in den Usergallerien unverändert.
MySQL bietet nur hierfür (eeeendlich) ab der Version 5 eine elegante Lösung des Problems:
Trigger.
Und so sieht das kleine Triggerlein aus:
DELIMITER //
CREATE TRIGGER t_rename_boarduser
AFTER UPDATE ON forum_users
FOR EACH ROW
BEGIN
DECLARE initial_cap CHAR(1);
SET initial_cap = LOWER(SUBSTRING(NEW.username, 1, 1));
IF initial_cap REGEXP '[^a-z]' THEN
SET initial_cap := '@';
END IF;
REPLACE INTO siteusers (userid, name, name_initial_cap) VALUES (NEW.userid, NEW.username, initial_cap);
END//
Die Funktionsweise erklärt sich fast von selbst: Nach einem Update wird für jede aktualisierte Zeile der erste Buchstabe des Usernamens als Kleinbuchstabe in der Variablen initial_cap gespeichert. Sollte es ein Sonderzeichen (bzw. ein Zeichen, das nicht zwischen a und z liegt) sein, wird der Inhalt der Variablen mit einem '@' übeschrieben. Zum Schluss werden die Daten in die Tabelle aus der später die Daten für die Usergallerien gezogen werden, mit einem
REPLACE gespeichert. "NEW" steht für einen Cursor, der auf die Zeile nach dem Update steht - synonym dazu steht OLD für den alten Wert, so wäre beispielsweise in OLD.username der alte Username vor dem Update gespeichert.
...somit entfällt die Manipulation des Forumscodes.
Mit Triggern zu arbeiten macht Spass und kann die Effizienz einer Anwendung deutlich erhöhen, allerdings kann es auch zu bösen Endlosschleifen kommen, wenn man beim Programmieren nicht aufpasst