Warum ist ein ORM in Kombination mit Business-Logik sinnvoll?

Warum ist ein ORM in Kombination mit Business-Logik sinnvoll?

Bei der Entwicklung von Web-Anwendungen erfordert es oftmals eine Verarbeitung von Daten. Die Nutzung einer Objekt-relationalen Abbildung (ORM, Object-Relational Mapping), ist ein sehr leistungsfähiges Werkzeug, um die Arbeit mit diesen Daten zu strukturieren. Ein ORM bietet eine effektive Möglichkeit zur Vereinfachung der Datenhandhabung in der Programmierung, indem es eine Abstraktionsschicht zwischen der Datenbank und der Anwendungslogik einrichtet.

Ein ORM ermöglicht es, die Daten an eine Struktur zu binden und die zugrunde liegende Datenbank zu abstrahieren. Anstatt direkt mit der Datenbank zu interagieren, arbeiten Sie mit den Daten selbst. Das Ergebnis ist eine deutliche Vereinfachung des Codes und eine höhere Portabilität. Mit einem ORM können Sie verschiedene Datenmodelle in Ihrer Anwendung verwalten. Diese Modelle können in verschiedenen Datenbanksystemen gespeichert werden. Häufig in der Web-Entwicklung verwendet werden: MySQL, Postgres, SQLite, In-Memory, Redis oder Flat-File Datenbanken.

Mithilfe des ORM können Sie Ihre Daten einheitlich in Ihre Anwendung integrieren, deren Struktur modellieren, und die jeweiligen Vorzüge diverser Datenbank-Management Systeme in Anspruch nehmen. Anwendungsbeispiele aus unserem Alltag: Sessions in einem Redis-Cache speichern, Massen von Nutzerinteraktionen in einer Postgres-Datenbank speichern und globale Einstellungsdaten in einer In-Memory Datenbank vorhalten. Wir verwenden ORMs häufig bei Rapid Application Development (RAD), da wir hier sehr Zeit-effizient Daten modellieren und programmatisch verarbeiten können.

Die Vorteile von dynamischen Parametern und Business Logik

Mit ORM können Entwickler dynamische Parameter nutzen, die eine tiefe Verknüpfung zwischen der Geschäftslogik und den Daten herstellen. Bestimmte und global benötigte Verarbeitungsroutinen können so direkt an ein Datenmodell geknüpft werden. Einige Beispiele für häufige Verarbeitungsroutinen sind:

  • Formatierungen von Beschreibungstexten,
  • Formatierung eines Preises mit Rundung und Währungszeichen,
  • Ausgabe aller Hyperlinks, die in einem Beschreibungstext enthalten sind,
  • Zählung von Einträgen, die mit dem Datenmodell verknüpft sind, z.B. Kommentare zu einem Blog-Beitrag,
  • Ausgabe eines zu dem Datenmodell gehörigen Hyperlinks inkl. Domain und Tracking-Parameter,
  • Berechnung der aktuellen Gesamtsumme eines Warenkorbs inkl. Versandkosten,
  • Ausgabe aller abgebrochenen Bestellvorgänge inkl. einer Liste der zugehörigen Artikel,
  • Ausgabe aller Blog-Beiträge einer Kategorie, absteigend sortiert nach Datum, mit Limit und Offset,
  • uvm.

Viele dieser Routinen werden häufig in Utilities (Helfer-Klassen) ausgelagert. Es ist jedoch sehr sinnvoll, die Business-Logik direkt an die Daten zu knüpfen. Viele ORM-Systeme, wie beispielsweise Eloquent von Laravel, lässt die Vererbung und Erweiterung eines Datenmodells zu. Es entsteht somit nicht zwangsläufig eine Monster-Klasse, mit hunderten Funktionen. Der Vorteil hier ist, dass alle wichtigen Logiken zur Ausgabe und Verarbeitung direkt an die Datenschicht geknüpft ist. So lassen sich sinnvolle Module entwickeln, und die Abstraktion sinnvoll einsetzen. So wird auch verhindert, dass bestimmte Business-Logik mehrfach über die Anwendung hinweg verdoppelt wird, und uneinheitliche Zustände entstehen.

Vor- und Nachverarbeitung von Parametern

Die allermeisten ORM bieten neben dynamischen Parametern auch die Möglichkeit an, auf Veränderungen zu reagieren. Durch ein Event-System können Daten beispielsweise vor, während oder nach dem Speichervorgang modifiziert werden. Einige Beispiele für sinnvolle Events sind:

  • Vor dem Speichern eines Blog-Beitrages noch die Wörter zählen, und den entsprechenden Parameter aktualisieren,
  • Nach dem Löschen eines Blog-Beitrags auch dessen Kommentare entfernen,
  • Nach dem Veröffentlichen eines Blog-Beitrages automatisch einen E-Mail Newsletter planen,
  • Nach dem Abspeichern eines Kontaktformulars eine Benachrichtigungsemail versenden,
  • Nach dem Speichern einer Änderung den entsprechenden Cache leeren,
  • uvm.

Viele dieser Vorgänge werden häufig in der Entwicklung einer Web-Anwendung benötigt. Dabei ist es sehr sinnvoll, ein bestehendes, eingespieltes und häufig verwendetes System einzusetzen. Wir sind kein Verfechter davon, das Rad für jedes Projekt neu zu erfinden. Diese bestehenden Systeme ermöglichen einen schnellen Aufbau neuer Projekte nach gewohnten Strukturen.

Einfache Datenbankmigrationen

Ein weiterer bedeutender Vorteil von ORMs ist die Unterstützung von Datenbankmigrationen. Migrationen erleichtern die Durchführung von Strukturveränderungen in der Datenbank. Sie ermöglichen das Ein- und Ausspielen von Veränderungen, was bei großen Datenmengen äußerst nützlich ist. Außerdem können Sie Migrationen nutzen, um Systeme leicht zu migrieren, beispielsweise beim Ausrollen von Änderungen von einer Staging-Umgebung auf die Produktions-Umgebung.

Die Abstraktion der Datenstruktur mithilfe von Migrationen erleichtert außerdem eine Änderung des Datenbank-Management Systems. Bei geänderten Anforderungen kann es z.B. sinnvoll sein, aufgrund von Geschwindigkeitsvorteilen ein Datenbank-Management System auszutauschen. Da die Änderung in der Abstraktionsschicht des ORM stattfindet, muss die Anwendungslogik nicht verändert werden. 

Vereinfachung der Programmierung

Die Vereinfachung der Programmierung ist einer der bemerkenswertesten Vorteile von ORM. Anstatt komplexe SQL-Abfragen zu schreiben, die für jeden Datenbanktyp unterschiedlich sein können, ermöglicht das ORM den Entwicklern, in der Sprache zu arbeiten, die sie am besten kennen - ihrer Hauptprogrammiersprache. 

Sie können Objekte erstellen, aktualisieren, lesen und löschen, als wären es einfache Objekte in ihrer bevorzugten Programmiersprache, und das ORM kümmert sich um die Datenbankinteraktionen im Hintergrund. Darüber hinaus bietet ORM eine konsistente API für diese Operationen, was bedeutet, dass Sie den Code nicht ändern müssen, wenn Sie die zugrundeliegende Datenbank ändern. Es reduziert auch die Menge an Boilerplate-Code, den Entwickler schreiben müssen, und macht den Code leichter zu lesen und zu warten. Dies führt letztendlich zu einer erheblichen Steigerung der Produktivität und Effizienz der Entwickler.

Damit wollen wir nicht sagen, dass ein ORM hundertprozentig manuelle Datenbankabfragen ersetzt! Aber die allermeisten Abfragen können direkt mithilfe der ORM-Schnittstellen abgehandelt werden.

Meine Meinung als IT-Ingenieur

Im Laufe der Jahre habe ich hunderte Projekte betreut, übernommen, selbst implementiert oder Support geleistet. In Summe kann ich aus meinen persönlichen Erfahrungen sagen, dass die meisten ORM-basierten Projekte weniger Bugs vorweisen konnten. Die meisten Projekte enthalten Anwendungslogik, die teilweise unter Zeitdruck entstanden ist. Bewegt man sich in einem abstrahierten Rahmen, ist meiner Meinung eine geringere Fehlerwahrscheinlichkeit gegeben. Je weniger Komplex die Zusammenhänge sind, desto mehr Fokus auf die eigentliche Business-Logik ist gegeben.

Da wir häufig sehr schnell einen nutzbaren Prototypen für ein Projekt erstellen, bieten sich Rapid Application Development an. Also ein Web-Framework, ein ORM, ein Design-System sowie ein standardisierterer Prozess. Ein Wechsel von SQLite auf MySQL ist keine Seltenheit. Zudem schätze ich die diversen Schnittstellen und Abstraktionen eines ORM. Sortieren, Filtern, Aktualisieren von Daten ist in wenigen Zeilen Code erledigt.

Für mich macht ein ORM eine Anwendung auch nicht pauschal langsamer. Insbesondere durch den intelligenten Einsatz von Caching werden die meisten Bremsen bereits gelöst - auch bei Verwendung von komplexen, dynamischen Parametern.