Nun, eine Sache, die wichtig ist, wenn wir eine Diskussion wie diese haben, ist die klare Unterscheidung zwischen objektrelationalen Mappern ("ORM") und Datenbankabstraktionsebenen . Ein ORM ist eine Art Datenbankabstraktionsschicht, aber nicht alle Datenbankabstraktionsschichten sind ORMs. Ein gutes Werkzeug, um dies zu verstehen, ist die beliebte SQLAlchemy- Bibliothek von Python , die sich selbst als "SQL-Toolkit und objektrelationaler Mapper" (meine Fettschrift) mit der Idee ausgibt, dass dies verschiedene Dinge sind. Wie sie es auf ihrer Hauptmerkmalseite formulieren :
Kein ORM erforderlich
SQLAlchemy besteht aus zwei unterschiedlichen Komponenten, dem Core und dem ORM . Der Core selbst ist ein voll ausgestattetes SQL-Abstraktions-Toolkit, das eine reibungslose Abstraktionsebene für eine Vielzahl von DBAPI-Implementierungen und -Verhalten sowie eine SQL-Ausdruckssprache bietet, mit der die SQL-Sprache über generative Python-Ausdrücke ausgedrückt werden kann. Ein Schemadarstellungssystem, das sowohl DDL-Anweisungen ausgeben als auch vorhandene Schemata prüfen kann, und ein Typsystem, das die Zuordnung von Python-Typen zu Datenbanktypen ermöglicht, runden das System ab. Der Object Relational Mapper ist dann ein optionales Paket, das auf dem Core aufbaut.
Die Titelseite beschreibt den ORM folgendermaßen:
SQLAlchemy ist am bekanntesten für seinen objektrelationalen Mapper (ORM), eine optionale Komponente, die das Daten-Mapper-Muster bereitstellt, mit dem Klassen der Datenbank auf verschiedene Arten zugeordnet werden können, so dass sich das Objektmodell und das Datenbankschema in einer Weise entwickeln können Von Anfang an sauber entkoppelt.
Die Schlüsselidee eines ORM besteht darin, die berühmte Fehlanpassung der objektrelationalen Impedanz zu überbrücken . Dies bedeutet, dass Beziehungen zwischen benutzerdefinierten Klassen zu Tabellen in einem Datenbankschema definiert und automatische Vorgänge zum Speichern und Laden für die Klassen Ihrer Anwendung bereitgestellt werden.
Im Gegensatz dazu tendieren Nicht-ORM-Datenbankabstraktionsebenen eher zum relationalen Datenmodell und zu SQL und überhaupt nicht zur Objektorientierung. Anstatt also die „Zuordnungen“ zwischen Tabellen und Klassen und Ausblenden des Datenbankschemas von dem Programmierer, neigen sie zu entlarven , die Datenbank für den Programmierer aber mit besserer APIs und Abstraktionen. Mit SQL Query Buildern können Sie beispielsweise komplexe SQL-Abfragen programmgesteuert ohne Manipulation von Zeichenfolgen wie folgt generieren ( ein Beispiel aus der jOOQ-Bibliothek für Java ):
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(1948))
.fetch();
Nun scheint das Play-Framework nicht zu 100% mit dem übereinzustimmen , was ich gerade beschrieben habe , aber ihr Argument scheint in diesem allgemeinen Raum zu liegen: Arbeiten Sie direkt mit dem relationalen Modell, anstatt es in Klassen und umgekehrt zu übersetzen.
Die jOOQ-Bibliothek ist als Kontrapunkt zu ORMs lohnenswert. Sie haben auch einige relevante Blog-Einträge, die es wert sind, gelesen zu werden: