Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / Themen-Blog1 / lasst-die-datenbank-ihren-job-machen.php

Lasst die Datenbank ihren Job machen!

Oft schau ich mir Code an und sehe, dass Leute offenbar zu faul für vernünftige SQL-Statements sind. Da wird eine extrem allgemein gehaltene Abfrage auf die Datenbank losgelassen, um dann im Nachklang mit PHP zu filtern / zu gruppieren. Warum? Die Datenbank ist doch zum rechnen und für genau so Aufgaben gedacht. Zudem ists auch noch viel performanter, die Datenbank einfach ihren Job erledigen zu lassen. Vielleicht programmieren gewisse Leute einfach viel zu gern PHP, als das sie sich von der Datenbank die Arbeit abnehmen lassen würden?

Berechnungen im SELECT

SELECT price FROM product

while ($row = $sql->fetch())
{
    print $row['price'] * 1.95583;
}

Warum nicht einfach:

SELECT price*1.95583 AS europreis FROM product

Okay, jetzt nicht das beste Beispiel aber prinzipiell läuft einem sowas öfter über den Weg.

Datenbank-Konsistenz

Ich kann auch nicht verstehen, warum die Leute alle die absolut geilen InnoDB-Features außen vor lassen. Foreign Keys zum Beispiel. Da werden dann in Cronjobs abenteuerliche Abfragen auf die Datenbank abgesetzt, um die Konsistenz wieder herzustellen. Ein gut gewähltes Fremdschlüssel-Datenmodell erledigt sowas doch, dafür ist es gemacht!

Transactions

Auch sehr gern gesehen: Menschen programmieren selbst eine Rollback-Funktionalität, um fehlgeschlagene Abfragen revidieren zu können. Da werden dann Arrays mit wiederherzustellenden Werten angelegt, falls eine Abfrage nicht klappt. Dafür gibt es doch Transaktionen! Die können genau das und zwar wesentlich besser. Außerdem kann man Transaktionen garnicht vollständig emulieren.

Validierung

Viel zu selten benutzt: Enum und Set. Warum nicht die Möglichkeit nutzen, nur bereits vordefinierte Werte zuzulassen? Das ist immerhin die wasserdichteste Variante, um sicherzustellen, dass nur zugelassene Werte in der Datenbank landen.

Werteprüfung

Im Artikel MySQL Inputvalidierung mit Triggern stelle ich einen Weg vor, wie man mittels Triggern erreichen kann, dass nur gewisse Wertebereiche in Tabellen eingefügt werden dürfen. Daran scheiden sich allerdings die Geister, ob man das zur „best practice“ ernennen sollte, weil Trigger „versteckt“ auf der Datenbank agieren und für ordentlich Verwirrung sorgen können.

Datumsberechnungen

Oft brechen sich Programmierer auch die Wurst mit strtotime, date und mktime ab, um Daten zu updaten. MySQL bringt aber hier – genau wie alle anderen ernstzunehmenden DBMS auch – wunderbare Zeitfunktionen mit. Weiterer Vorteil dabei: Man ist nicht mehr darauf angewiesen, dass die Zeit des Datenbankservers und des Webservers sekundengenau gleich eingestellt ist, weil alle Zeitberechnungen nur noch auf Datenbankseite erledigt werden.