Warum sollten Sie ein ORM verwenden? [geschlossen]


113

Wenn Sie die "Profis" motivieren würden, warum Sie ein ORM für das Management / den Kunden verwenden würden, welche Gründe wären das?

Versuchen Sie, einen Grund pro Antwort beizubehalten, damit wir sehen können, was als beste Gründe gewählt wird


3
Sie sollten es zu einem Wiki machen, wenn Sie eine Umfrage wünschen
frankodwyer

+1 für das
Erstellen

16
Was ist mit den Betrügern?
Brian Matthews

4
Und auch keinen Löffel. Nein, wirklich, es gibt einen Nachteil: Leistung. Es ist viel einfacher, DB-Abfragen zu optimieren, wenn Sie das ORM nicht durchlaufen müssen. (Ich beschwere mich nicht - nachdem ich kürzlich zu ORM gewechselt bin, bin ich größtenteils damit zufrieden; für allgemeine Zwecke ist ORM der richtige Weg; aber halten Sie eine Möglichkeit, Abfragen näher am Metall auszuführen, wenn Sie die Leistung benötigen)
Piskvor verließ das Gebäude

2
@ UğurGümüşhan, IMHO Der Hauptvorteil der Verwendung eines ORM besteht darin, Entwickler produktiver zu machen, indem sie in derselben Sprache und demselben OO-Paradigma programmieren, das sie im Rest ihrer App verwenden. Gespeicherte Prozeduren können dies nicht bereitstellen, wenn sie den Entwicklercode in der Sprache der gespeicherten RDBMS-Prozeduren erstellen. Sie können also nicht alles tun, was ein ORM kann.
Bill Karwin

Antworten:


53

Den Datenzugriff abstrakter und portabler gestalten. ORM-Implementierungsklassen können herstellerspezifisches SQL schreiben, müssen dies also nicht.


61
Ich stimme zwar zu, dass dies ein Merkmal von ORMs ist, würde aber vorschlagen, dass der Anwendungsfall ziemlich begrenzt ist. Ich habe seit ungefähr einem Jahrzehnt nie wirklich etwas anderes als MySql und SQLite verwendet. Ich denke, es ist wahrscheinlich eine sehr seltene Anforderung für die meisten Entwickler.
Troelskn

40
@troelskn: Ich stimme zu, ich habe viele RDBMS-Produkte verwendet, aber nie mehr als ein oder zwei pro Projekt. Portabilität ist also nicht der praktischste Wert für die Abstraktion von SQL. Ich denke, viele ORM-Benutzer möchten einfach die Codierung in SQL überhaupt vermeiden.
Bill Karwin

2
Anbieter kommen ständig mit neuen Versionen / Funktionen heraus ... brauchen nur ein paar coole Leute, um den Dialekt zu schreiben und ein einfaches Upgrade durchzuführen!
Dotjoe

5
Typische nutzlose Antwort Ich frage mich, warum sie als gute Antwort markiert ist. Der Typ, der die Frage stellt, versucht einfach, seinem Chef zu rechtfertigen, dass er ein ORM verwenden soll :) Meine Frage wäre eher, auf welche Art von Problem Sie mit Hibernate stoßen stackoverflow.com/questions/6477170/…
user310291

2
@ user310291: Das OP hat nicht nach Problemen oder Fallstricken gefragt, sondern nach den Vorteilen der Verwendung eines ORM. Natürlich gibt es Vor- und Nachteile, aber er fragte nach den Vor- und Nachteilen. Ehrlich gesagt bin ich überrascht, dass diese Antwort akzeptiert wurde und so viele positive Stimmen erhielt wie sie, weil ich sie nicht als Hauptvorteil eines ORM betrachten würde.
Bill Karwin

83

Der wichtigste Grund für die Verwendung eines ORM besteht darin, dass Sie über ein umfangreiches, objektorientiertes Geschäftsmodell verfügen und es dennoch speichern und effektive Abfragen schnell in eine relationale Datenbank schreiben können. Aus meiner Sicht sehe ich keine wirklichen Vorteile, die Ihnen ein guter ORM im Vergleich zu anderen generierten DALs bietet, außer den erweiterten Arten von Abfragen, die Sie schreiben können.

Eine Art von Abfrage, an die ich denke, ist eine polymorphe Abfrage. Eine einfache ORM-Abfrage kann alle Formen in Ihrer Datenbank auswählen. Sie erhalten eine Sammlung von Formen zurück. Aber jede Instanz ist je nach Diskriminator ein Quadrat, ein Kreis oder ein Rechteck.

Eine andere Art der Abfrage wäre eine, die eifrig ein Objekt und ein oder mehrere verwandte Objekte oder Sammlungen in einem einzigen Datenbankaufruf abruft. Beispiel: Jedes Formobjekt wird mit seinen ausgefüllten Scheitelpunkt- und Seitensammlungen zurückgegeben.

Es tut mir leid, dass ich mit so vielen anderen hier nicht einverstanden bin, aber ich denke nicht, dass die Codegenerierung ein Grund genug ist, sich für ein ORM zu entscheiden. Sie können viele gute DAL-Vorlagen für Codegeneratoren schreiben oder finden, die nicht den konzeptionellen oder Leistungsaufwand haben, den ORMs verursachen.

Oder wenn Sie der Meinung sind, dass Sie nicht wissen müssen, wie man gutes SQL schreibt, um ein ORM zu verwenden, bin ich anderer Meinung. Es kann sein, dass es aus der Sicht des Schreibens einzelner Abfragen einfacher ist, sich auf ein ORM zu verlassen. Mit ORMs ist es jedoch viel zu einfach, Routinen mit schlechter Leistung zu erstellen, wenn Entwickler nicht verstehen, wie ihre Abfragen mit dem ORM und dem SQL funktionieren, in das sie übersetzen.

Eine Datenschicht, die für mehrere Datenbanken geeignet ist, kann von Vorteil sein. Darauf musste ich mich allerdings nicht oft verlassen.

Am Ende muss ich noch einmal betonen, dass es meiner Erfahrung nach andere Optionen gibt, die die verbleibenden Probleme mit weniger Lernen und weniger CPU-Zyklen lösen, wenn Sie nicht die erweiterten Abfragefunktionen Ihres ORM verwenden.

Oh ja, einige Entwickler finden es lustig, mit ORMs zu arbeiten, daher sind ORMs auch aus der Perspektive, Entwickler glücklich zu machen, gut. =)


1
Gut gesagt. Während das Originalposter speziell nach "Vor-" und nicht nach "Nachteilen" suchte, habe ich einige SCHRECKLICHE SQL-Anweisungen gesehen, die erstellt wurden, indem die Auswirkungen der Verwendung von ORM nicht verstanden wurden. Für mich ist der größte Vorteil für einfache CRUD-Transaktionen, die den größten Teil Ihres DAL-Codes für Transaktionssysteme ausmachen. Ich denke, Sie teilen Haare zwischen reinem ORM und anderen generierten DAL-Methoden. Ich denke, alles, was Ihnen beim Übersetzen zwischen Objekten und der Datenbank hilft, kann als ORM betrachtet werden. Es ist nur ein anderes Betriebsmodell.
Doug Lampe

1
@Doug - Ich denke, der Unterschied, nach dem ich gesucht habe, war, dass ein einfacher DAL aus wenig mehr als generiertem CRUD-SQL bestand, während ein ORM viel mehr Abstraktionen wie Navigationseigenschaften, Sammlungspersistenz, dedizierte Abfragesprachen, Caches usw. enthielt. - Ein besserer Weg Wenn Sie meinen Standpunkt im Lichte Ihrer Beobachtung darlegen, könnte es sein, dass die Verwendung von mehr Funktionen eines ORM zwar eine schnellere Implementierung ermöglicht, es jedoch keineswegs akzeptabel ist, die Funktionsweise dieser Funktionen nicht zu kennen. Vielleicht, weil die Abstraktionen von ORMs mehr als die meisten lecken ( en.wikipedia.org/wiki/Leaky_abstraction )
Chuck

Bitte erläutern Sie dies noch einmal: "Wenn Sie die erweiterten Abfragefunktionen Ihres ORM nicht verwenden, gibt es andere Optionen, die die verbleibenden Probleme lösen." Außerdem sagt der Schöpfer von Hibernate Gavin King: "In der Tat sind Systeme wie Hibernate absichtlich als" undichte Abstraktionen "konzipiert, so dass es möglich ist, natives SQL bei Bedarf einfach zu mischen. Die Undichtigkeit der ORM-Abstraktion ist eine Funktion, kein Fehler ! " - reddit.com/r/programming/comments/2cnw8x/…
jungle_mole

1) Das ist alt. Damals hatten ORMs alle Funktionen (Caches, Abfragen, Batching usw.). IMHO, objektbasierte, polymorphe Abfragen waren die einzige ORM-Funktion, die Codegen (explizite ADO-Zuordnung) nicht einfach bereitstellen konnte. 2) Während einige nützliche Löcher absichtlich belassen wurden, gab es auch notwendige Übel und erweiterte Funktionen, die eine hohe Lernkurve in ORMs erzeugten. Meine Antwort war also, Code-Gen anstelle von ORMs zu verwenden, es sei denn, Sie benötigten erweiterte Abfragen. *) Gegenwärtig gibt es genügend Abwechslung bei ORMs, sodass wahrscheinlich die richtigen Funktionen für Ihr Team verfügbar sind. Mein Team mag jetzt Linq2DB.
Chuck

60

Beschleunigung der Entwicklung. Entfernen Sie beispielsweise sich wiederholenden Code wie das Zuordnen von Abfrageergebnisfeldern zu Objektelementen und umgekehrt.


3
Wiederholter Code ist sehr schlecht, aber könnten Sie keine Abstraktion erstellen, die dies entfernen würde? Beispielsweise können Sie ein Tabellen- / Abfrageergebnisobjekt haben, das Ihnen Zeilen zurückgibt, mit denen Sie dann Dinge erledigen können. ORMs scheinen Zeilen in einzelne Klasseninstanzen aufzuteilen, anstatt auf die von der DB ausgewählte Abstraktion einzugehen, bei der es sich um Tabellen / Zeilen mit Abfrageergebnissen handelt. Ich sage nicht, dass dies bedeutet, dass ORMs nicht gut sind, aber ich bin nicht sicher, ob dies allein ein Grund für ihre Verwendung ist.
Benjohn

@Benjohn, ich bin einverstanden , dass die ORM - Lösung behandelt einzelnen Zeilen als Objekte, während RDBMS behandelt Sätze von Zeilen als eine Einheit. Es gibt Dinge, die Sie in der RDBMS-Denkweise tun können, die Sie in einer OO-Denkweise nicht tun können.
Bill Karwin

Dies ist wie der Kauf eines ganzen Autos, nur um den Kofferraum zu benutzen. Es gibt viele Möglichkeiten, sich wiederholende Arbeiten zu vermeiden
Mohas

15

Unterstützung der OO-Kapselung von Geschäftsregeln in Ihrer Datenzugriffsschicht. Sie können Geschäftsregeln in der von Ihnen bevorzugten Anwendungssprache schreiben (und debuggen), anstatt klobige Trigger- und gespeicherte Prozedursprachen.


Möchten Sie Ihre Geschäftsregeln nicht in der Datenbank haben? Das ist ein Vorteil einer Datenbank, richtig: Mehrere Clients können dieselbe vom DBMS bereitgestellte Schnittstelle verwenden. Wenn ein Großteil Ihrer Schnittstellenlogik im ORM-Code eines bestimmten Clients eingeschlossen ist, befindet er sich nicht in der Datenbank und wird von anderen Clients nicht verwendet. Cue Front Office Back Office Pausen (ein Kundenmodell gerät aus dem Gleichgewicht mit dem eines anderen).
Benjohn

1
@Benjohn, ich neige dazu, einfach Geschäftsregeln in die Datenbank aufzunehmen, aber komplexere Regeln lassen sich nicht leicht in deklarativen Einschränkungen bilden. Beispiel: "Der Kunde erhält 10% Rabatt auf die gesamte Bestellung, wenn er zum ersten Mal mehr als drei Paar Hosen derselben Marke kauft." Wie würden Sie diese Geschäftsregel in die Datenbank aufnehmen (denken Sie daran, dass eine Antwort mit gespeicherten Prozeduren umständlich ist).
Bill Karwin

Es ist 2020, ich sehe niemanden mehr, der gespeicherte Prozeduren verwendet. Also zeigst du noch steht?
ospider

Ich denke, mein Punkt ist, dass die Leute keine gespeicherten Prozeduren verwenden, sondern Anwendungscode. Hast du etwas anderes verstanden?
Bill Karwin vor


8

Sie können problemlos zu einer anderen Datenbanksoftware wechseln, da Sie sich zu einer Abstraktion entwickeln.


41
In mehr als 30 Jahren Datenbankarbeit musste ich dies nicht ein einziges Mal tun.
HLGEM

4
Das heißt nicht, dass es nicht möglich ist! :)
Matt Fenelon

2
@HLGEM bedeutet, dass Sie die Auswahl für den Kunden schließen. Es könnte tatsächlich passieren, dass wir in nur 3 Jahren Webapps-Arbeit tragbare Software mit ORMs erstellt haben
Alfabravo

1
Sie können es nützlich finden, wenn Sie Tests auf einer In-Memory-Datenbank
ausführen

Es ist möglich, dass mehrere Instanzen derselben Software unterschiedliche Datenbanken verwenden. Das Verschieben vorhandener Daten von einer DB-Software in eine andere kommt jedoch nur sehr selten vor. Und wenn doch, helfen Ihnen viele ORMs dabei nicht wirklich.
15.

4

Damit Ihr Objektmodell und Ihr Persistenzmodell übereinstimmen.


1
Vielleicht, damit Ihre Persistenz für Ihr Objektmodell transparent ist
S.Lott

4

Entwicklungsglück, IMO. ORM abstrahiert viele der Bare-Metal-Aufgaben, die Sie in SQL ausführen müssen. Es hält Ihre Codebasis einfach: Weniger zu verwaltende Quelldateien und Schemaänderungen erfordern keine stundenlange Wartung.

Ich verwende derzeit ein ORM und es hat meine Entwicklung beschleunigt.



3

Der Grund, warum ich mich damit beschäftige, besteht darin, den generierten Code aus den DAL-Tools von VS2005 (Schema-Mapping, TableAdapters) zu vermeiden.

Das DAL / BLL, das ich vor über einem Jahr erstellt habe, funktionierte einwandfrei (für das, wofür ich es erstellt hatte), bis jemand anderes damit begann, einige der generierten Funktionen zu nutzen (von denen ich keine Ahnung hatte, dass sie vorhanden waren).

Es sieht so aus, als würde es eine viel intuitivere und sauberere Lösung bieten als die DAL / BLL-Lösung von http://wwww.asp.net

Ich habe darüber nachgedacht, meinen eigenen SQL Command C # DAL-Codegenerator zu erstellen, aber das ORM sieht nach einer eleganteren Lösung aus


2

Zusammenstellung und Prüfung von Abfragen.

Wenn sich die Tools für ORMs verbessern, ist es einfacher, die Richtigkeit Ihrer Abfragen durch Fehler und Tests bei der Kompilierung schneller zu ermitteln.

Durch das Kompilieren Ihrer Abfragen können Entwickler Fehler schneller finden. Richtig? Richtig. Diese Kompilierung wird ermöglicht, da Entwickler jetzt Abfragen in Code mit ihren Geschäftsobjekten oder -modellen schreiben, anstatt nur SQL-Zeichenfolgen oder SQL-ähnliche Anweisungen.

Wenn Sie in .NET die richtigen Datenzugriffsmuster verwenden, können Sie Ihre Abfragelogik problemlos in Speichersammlungen testen. Dies beschleunigt die Ausführung Ihrer Tests, da Sie nicht auf die Datenbank zugreifen, Daten in der Datenbank einrichten oder sogar einen vollständigen Datenkontext erstellen müssen. [BEARBEITEN] Dies ist nicht so wahr, wie ich es als Einheit gedacht habe Das Testen im Gedächtnis kann schwierige Herausforderungen darstellen . Aber ich finde diese Integrationstests immer noch einfacher zu schreiben als in den Vorjahren. [/ EDIT]

Dies ist heute definitiv relevanter als vor einigen Jahren, als die Frage gestellt wurde, aber dies ist möglicherweise nur bei Visual Studio und Entity Framework der Fall, wo meine Erfahrung liegt. Plugin wenn möglich deine eigene Umgebung.


1

Abstrahieren Sie die SQL in 95% der Fälle, damit nicht jeder im Team wissen muss, wie man hocheffiziente datenbankspezifische Abfragen schreibt.


1

Ich denke, hier gibt es viele gute Punkte (Portabilität, einfache Entwicklung / Wartung, Konzentration auf OO-Geschäftsmodellierung usw.), aber wenn Sie versuchen, Ihren Kunden oder Ihr Management zu überzeugen, läuft alles darauf hinaus, wie viel Geld Sie durch die Verwendung sparen ein ORM .

Wenn Sie einige Schätzungen für typische Aufgaben (oder sogar größere Projekte, die möglicherweise anstehen) vornehmen, erhalten Sie (hoffentlich!) Einige Argumente für den Wechsel, die schwer zu ignorieren sind.


0

.net-Ebenen mit Code-Smith-Vorlagen

http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1

Warum etwas codieren, das genauso gut generiert werden kann?


Pfui. Wir haben Net Tiers für ein großes kommerzielles Projekt verwendet, und ich würde dringend davon abraten, es zu verwenden. Das Problem ist, dass es nicht zusammensetzbar ist. Möchten Sie Foo- und Bar-Objekte abfragen? Sie können keine Joins schreiben, sondern müssen für jeden gewünschten Objekttyp separate Abfragen ausführen. Dies führt zu vielen Aufrufen der Datenbank, die die Leistung und Atomizität beeinträchtigen können. Schlecht schlecht schlecht. Bleib weg.
Judah Gabriel Himango

0

Überzeugen Sie sie davon, wie viel Zeit / Geld Sie sparen, wenn Änderungen eingehen, und Sie müssen Ihre SQL nicht neu schreiben, da das ORM-Tool dies für Sie erledigt


0

Ich denke, ein Nachteil ist, dass ORM in Ihrem POJO aktualisiert werden muss. hauptsächlich im Zusammenhang mit Schema, Beziehung und Abfrage. Ein Szenario, in dem Sie keine Änderungen an Modellobjekten vornehmen sollen, liegt möglicherweise daran, dass es von mehreren Personen gemeinsam genutzt wird, die sich auf einem Projekt oder einem s / w-Client und -Server befinden. In solchen Fällen müssen Sie es in zwei Ebenen aufteilen, was zusätzliche Anstrengungen erfordert.

Ich bin ein Android-Entwickler und wie Sie wissen, sind mobile Apps normalerweise nicht sehr groß. Daher scheint dieser zusätzliche Aufwand zur Trennung von reinem Modell und von Orm betroffenem Modell nicht voll zu sein.

Ich verstehe, dass diese Frage generisch ist. Mobile Apps gehören aber auch zum allgemeinen Dach.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.