Vertane Chancen oder Warum man nicht mit SQL modelliert

Ausdrucksschwache Sprache

Ein Business-Model definiert man üblicherweise in einer Sprache, die ausdrucksfähig genug dazu ist. Wieso bildet die ActiveRecord Implementation bei Ruby on Rails dann ausgerechnet einfach das Datenbankschema ab? In SQL99 gibt es zwei numerische Typen, drei Datumstypen und Strings. Wie bitte schön kann ich ausdrücken, dass ein Attribut eine E-Mail Adresse ist? Oder eine Postleitzahl?

Überall, wo die Postleitzahl benutzt wird, muss der Entwickler aufpassen, dass diese auch ja wohlgeformt wird. Das ist eine klassische Aufgabe, die man dem Framework überlassen will. Aber das Modell ist hat keine ausreichende semantische Tiefe.

Das richtige Ende

Django benutzt ebenfalls ActiveRecord, allerdings andersrum. Die Modell-Definitionen sind Python-Code, aus denen das Datenbankschema generiert wird. Hier hat man die komplette Ausdrucksfähigkeit von Python. Man könnte Validierungslogik und komplexe Bedingungen (“dieses numerische Feld darf nur Primzahlen enthalten”) formulieren.

Leider werden diese Möglichkeiten in Django noch nicht ausreichend genutzt. Nur einfache Typen wie Email oder Längenbeschränkungen können ausgedrückt werden. Für alles Andere muss wieder jeder Entwickler eine eigene Lösung finden und dabei Fehler machen.

Wiederverwendung

Damit die armen Entwickler von Webanwendungen nicht dazu verdammt sind, die immer gleichen Fehler wieder und wieder zu machen, sollte ein Framework auch eine Bibliothek von vordefinierten Datentypen (Name, Telefonnummer, URL, TextMitHTML) haben, die dann “sicher” in einer Anwendung verwendet werden können. Filterung, Validierung und Konvertierung (z.B. nach (X)HTML, JSON usw.) wären dann zentral definiert, vergessene Escapes (die einen grossen Teil der Injektionsattacken ausmachen) wären dann Schnee von gestern.

Fazit

  • In Web-Applikationen könnte man viel mehr Funktionalität in das Applikationsframework auslagern, wenn man mehr über die Typen wüsste.
  • Modelliere in der ausdrucksstärkeren Sprache, nicht im kleinsten gemeinsamen Nenner.

Einen Kommentar schreiben