EMZETT.
Login

ORM und Datenbankzugriff: Objekte statt SQL – Vor- und Nachteile

Kurz: Ein ORM bildet Datenbanktabellen auf Objekte ab, sodass man Daten mit Code statt SQL abfragt; das spart Schreibarbeit, kann aber Leistung und Verständnis kosten.

Genauer: ORM steht für Object-Relational Mapping: Tabellen werden zu Klassen, Zeilen zu Objekten, Spalten zu Eigenschaften. Beispiele: Hibernate/JPA (Java), Entity Framework (C#), SQLAlchemy und Django ORM (Python), Prisma, Drizzle, TypeORM (JavaScript/TypeScript), ActiveRecord (Ruby), Eloquent (PHP).

Im Detail

Beispiel

// Drizzle (TypeScript)
const aktive = await db
  .select()
  .from(nutzer)
  .where(and(eq(nutzer.aktiv, true), gt(nutzer.alter, 17)))
  .orderBy(nutzer.name)
  .limit(10);

Das Werkzeug erzeugt daraus SQL mit Parametern (Schutz vor SQL-Injection), führt es aus und liefert typisierte Objekte. Auch Schema-Migrationen und Beziehungen (1:n, n:m) werden unterstützt.

Vorteile

  • Weniger Boilerplate: kein manuelles Zuordnen von Zeilen zu Objekten.
  • Typsicherheit und Autovervollständigung im Editor.
  • Sicherheit: parametrisierte Abfragen standardmäßig.
  • Migrationen, Beziehungen, Validierung.
  • Datenbank-unabhängiger Code (in Grenzen).

Nachteile und Fallen

  • N+1-Problem: Für jedes Objekt wird eine weitere Abfrage ausgeführt (Liste von Bestellungen plus je eine Abfrage für Kunden). Lösung: Eager Loading (JOIN, include, joinedload).
  • Unüberlegte Abfragen: Es werden alle Spalten geladen, riesige Mengen im Speicher.
  • Abstraktion lecken: Komplexe Auswertungen, Fensterfunktionen, Spezialfunktionen lassen sich schwer ausdrücken; dann rohes SQL.
  • Lernkurve des ORMs zusätzlich zu SQL; man muss SQL trotzdem verstehen, um Leistung zu beurteilen (Indizes, EXPLAIN).
  • Magie (Lazy Loading, implizite Transaktionen) führt zu überraschendem Verhalten.

Wann ORM, wann SQL?

ORM für alltägliche CRUD-Operationen, wenig komplexe Abfragen. Query-Builder (Kysely, jOOQ, Knex) sind ein Mittelweg: SQL-nah, aber typsicher. Rohes SQL für Berichte, Analysen, Leistungsengpässe. Schau dir die erzeugten SQL-Abfragen an (Logging), plane Indizes und Migrationen bewusst. Wer SQL kennt, nutzt ORMs besser.

Siehe auch: N+1-Problem, SQL-Injection, Datenbank-Migration, Transaktionen und ACID