Gibt es gute Gründe, kein ORM zu verwenden? [geschlossen]


107

Während meiner Ausbildung habe ich NHibernate für einige kleinere Projekte verwendet, die ich größtenteils selbst codiert und entworfen habe. Bevor nun ein größeres Projekt gestartet wurde, wurde diskutiert, wie der Datenzugriff gestaltet werden soll und ob eine ORM-Schicht verwendet werden soll oder nicht. Da ich mich noch in der Lehre befinde und mich immer noch als Anfänger in der Unternehmensprogrammierung betrachte, habe ich meiner Meinung nach nicht wirklich versucht, dies zu tun. Die Verwendung eines objektrelationalen Mappers für die Datenbank kann die Entwicklung erheblich erleichtern. Die anderen Programmierer im Entwicklungsteam sind viel erfahrener als ich, daher denke ich, dass ich einfach das tun werde, was sie sagen. :-)

Ich verstehe jedoch zwei der Hauptgründe für die Nichtverwendung von NHibernate oder eines ähnlichen Projekts nicht vollständig:

  1. Sie können einfach Ihre eigenen Datenzugriffsobjekte mit SQL-Abfragen erstellen und diese Abfragen aus Microsoft SQL Server Management Studio kopieren.
  2. Das Debuggen eines ORM kann schwierig sein.

Natürlich könnte ich meine Datenzugriffsschicht einfach mit vielen SELECTs usw. erstellen , aber hier vermisse ich den Vorteil automatischer Verknüpfungen, verzögertes Laden von Proxy-Klassen und eines geringeren Wartungsaufwands, wenn eine Tabelle eine neue Spalte oder eine Spalte erhält umbenannt. (Aktualisieren von zahlreichen SELECT, INSERTund UPDATEAbfragen gegen die Mapping - Konfiguration aktualisieren und möglicherweise Refactoring der Business - Klassen und DTOs.)

Wenn Sie NHibernate verwenden, können unvorhergesehene Probleme auftreten, wenn Sie das Framework nicht sehr gut kennen. Dies kann beispielsweise darin bestehen, der Tabelle Table.hbm.xml zu vertrauen, in der Sie die Länge einer Zeichenfolge festlegen, die automatisch überprüft werden soll. Ich kann mir jedoch auch ähnliche Fehler in einer "einfachen" SqlConnection-Abfrage-basierten Datenzugriffsschicht vorstellen.

Sind diese oben genannten Argumente wirklich ein guter Grund, ein ORM nicht für eine nicht triviale datenbankbasierte Unternehmensanwendung zu verwenden? Gibt es wahrscheinlich andere Argumente, die sie / ich möglicherweise übersehen haben?

(Ich sollte wahrscheinlich hinzufügen, dass ich denke, dass dies wie die erste „große“ .NET / C # -basierte Anwendung ist, die Teamarbeit erfordert. Gute Praktiken, die bei Stapelüberlauf als ziemlich normal angesehen werden, wie z. B. Komponententests oder kontinuierliche Integration, sind keine -bisher hier vorhanden.)

Antworten:


26

In den letzten Jahren gab es eine Explosion des Wachstums mit ORMs, und Ihre erfahreneren Mitarbeiter denken möglicherweise immer noch an die Mentalität "Jeder Datenbankaufruf sollte über eine gespeicherte Prozedur erfolgen".

Warum sollte ein ORM das Debuggen erschweren? Sie erhalten das gleiche Ergebnis, unabhängig davon, ob es von einem gespeicherten Prozess oder vom ORM stammt.

Ich denke, der einzige wirkliche Nachteil, den ich mir bei einem ORM vorstellen kann, ist, dass das Sicherheitsmodell etwas weniger flexibel ist.

BEARBEITEN: Ich habe Ihre Frage gerade noch einmal gelesen und es sieht so aus, als würden sie die Abfragen kopieren und in Inline-SQL einfügen. Dies macht das Sicherheitsmodell mit einem ORM identisch, sodass es gegenüber diesem Ansatz absolut keinen Vorteil gegenüber einem ORM gibt. Wenn sie nicht parametrisierte Abfragen verwenden, ist dies tatsächlich ein Sicherheitsrisiko.


1
Schwieriger zu debuggen: Wenn eine Ausnahme ausgelöst wird, müssen Sie wahrscheinlich das Framework kennen, anstatt die Ausnahmen von SqlConnection usw. zu kennen
Hangy

4
Wäre die SQL-Ausnahme nicht Teil der ORM-Ausnahme?
Giovanni Galbo

1
Ja, die meisten schließen die Ausnahme ein, so dass Sie immer noch in der Lage sind, die ursprüngliche Ausnahme durch .inner
mattlant

Wie gesagt, ich habe dieses Argument nicht angesprochen. :) Natürlich sollte sich die echte SQL-Ausnahme irgendwo im Stack-Trace befinden. Wie Sie vielleicht aus meiner Frage gelesen haben, stimme ich Ihrer Antwort irgendwie zu, aber ich werde warten, bis ich sie akzeptiere. Vielleicht hat jemand anderes wirklich gute Gründe gegen ORM.
Hangy

Wie wäre es, wenn sich Ihre Datenbankstruktur stark von Ihren Geschäftsobjekten unterscheidet? Würde es nicht alles in einen Overhead verwandeln? Programmieren der Zuordnungen mit XML, anstatt nur die erforderlichen Funktionen auf der Datenbankseite mit SPs bereitzustellen ...?
Uri Abramson

58

Die kurze Antwort lautet: Ja, es gibt wirklich gute Gründe. In der Tat gibt es Fälle, in denen Sie ein ORM einfach nicht verwenden können.

In diesem Fall arbeite ich für ein großes Finanzinstitut eines Unternehmens und wir müssen viele Sicherheitsrichtlinien befolgen. Um die uns auferlegten Regeln und Vorschriften zu erfüllen, besteht die einzige Möglichkeit, Audits zu bestehen, darin, den Datenzugriff innerhalb gespeicherter Prozeduren zu halten. Nun mögen einige sagen, dass das einfach nur dumm ist, aber ehrlich gesagt ist es das nicht. Die Verwendung eines ORM-Tools bedeutet, dass der Tool / Entwickler einfügen, auswählen, aktualisieren oder löschen kann, was er oder sie möchte. Gespeicherte Prozeduren bieten viel mehr Sicherheit, insbesondere in Umgebungen beim Umgang mit Clientdaten. Ich denke, dies ist der größte Grund, darüber nachzudenken. Sicherheit.


25
Ich denke, dies ist eher eine Einschränkung der aktuellen Orm-Bibliotheken, die gespeicherte Prozeduren nicht unterstützen, als eine grundlegende Einschränkung oder Zuordnung. Es gibt Orms, die gespeicherte Prozesse und Ansichten verarbeiten können, und es gibt viel zu sagen für die Lösung für gespeicherte Prozesse von orm +.
Mendelt

4
Im Falle eines guten ORM sollten Sie in der Lage sein, SPs trotzdem zur Verwendung zu bringen (dies
mindert natürlich

3
Das Thema, warum SPs nicht wirklich mehr Sicherheit bieten als ein ORM, ist gut bearbeitet. Hier ist nur ein Artikel, der es gut anspricht
Tim Scott

1
Können Sie in SQL Server 2005 nicht einfach ein Schema in einer Datenbank nur für die ORM-Schicht festlegen? Oder ist das nicht genug? Wenn es sich bei den Anwendungen um Web-Apps handelt, besteht eine Sache darin, eine Verbindung zu einer Datenbank herzustellen. Die Sicherheit bleibt dann der Anwendungsschicht überlassen.
Min

2
Natürlich können Sie einschränken, was der Benutzer mit einem ORM tun kann. Sie legen einfach die Benutzersicherheitseinstellungen in SQL fest und erteilen ihnen die Berechtigung zum Einfügen / Aktualisieren / Löschen der gewünschten Einstellungen. Es wäre das gleiche wie das Setzen von Sicherheitsberechtigungen für gespeicherte Prozeduren
Doctor Jones

55

Der Sweet Spot von ORMs

ORMs sind nützlich, um 95% + der Abfragen dort zu automatisieren, wo sie anwendbar sind. Ihre besondere Stärke liegt darin, dass Sie eine Anwendung mit einer starken Objektmodellarchitektur und einer Datenbank haben, die gut mit diesem Objektmodell funktioniert. Wenn Sie einen neuen Build erstellen und über starke Modellierungsfähigkeiten in Ihrem Team verfügen, werden Sie mit einem ORM wahrscheinlich gute Ergebnisse erzielen.

Möglicherweise haben Sie eine Handvoll Abfragen, die besser von Hand erledigt werden. In diesem Fall haben Sie keine Angst, ein paar gespeicherte Prozeduren zu schreiben, um dies zu handhaben. Selbst wenn Sie beabsichtigen, Ihre App auf mehrere DBMS-Plattformen zu portieren, ist der datenbankabhängige Code in der Minderheit. Wenn Sie bedenken, dass Sie Ihre Anwendung auf jeder Plattform testen müssen, auf der Sie sie unterstützen möchten, wird ein wenig zusätzlicher Portierungsaufwand für einige gespeicherte Prozeduren keinen großen Unterschied für Ihre Gesamtbetriebskosten bedeuten. In erster Näherung ist 98% portabel genauso gut wie 100% portabel und weitaus besser als verschlungene oder leistungsschwache Lösungen, um die Grenzen eines ORM zu umgehen.

Ich habe gesehen, dass der frühere Ansatz bei einem sehr großen J2EE-Projekt (100 Mitarbeiterjahre) gut funktioniert.

Wo ein ORM möglicherweise nicht am besten passt

In anderen Fällen kann es Ansätze geben, die besser zur Anwendung passen als ein ORM. Fowlers Patterns of Enterprise Application Architecture enthält einen Abschnitt über Datenzugriffsmuster, in dem verschiedene Ansätze ziemlich gut katalogisiert werden können. Einige Beispiele für Situationen, in denen ein ORM möglicherweise nicht anwendbar ist, sind:

  • In einer Anwendung mit einer umfangreichen Legacy-Codebasis gespeicherter Prozeduren möchten Sie möglicherweise eine funktional ausgerichtete Datenzugriffsschicht (nicht zu verwechseln mit funktionalen Sprachen) verwenden, um die etablierten Sprocs zu verpacken. Dadurch wird die vorhandene (und daher getestete und debuggte) Datenzugriffsschicht und das Datenbankdesign wiederverwendet, was häufig einen erheblichen Entwicklungs- und Testaufwand darstellt und die Migration von Daten in ein neues Datenbankmodell erspart. Es ist oft eine gute Möglichkeit, Java-Ebenen um ältere PL / SQL-Codebasen zu wickeln oder Rich-Client-VB-, Powerbuilder- oder Delphi-Apps mit Webschnittstellen neu auszurichten.

  • In einer Variation erben Sie ein Datenmodell, das für die OR-Zuordnung nicht unbedingt gut geeignet ist. Wenn Sie (zum Beispiel) eine Schnittstelle schreiben, die Daten aus einer fremden Schnittstelle auffüllt oder extrahiert, ist es möglicherweise besser, direkt mit der Datenbank zu arbeiten.

  • Finanzanwendungen oder andere Arten von Systemen, bei denen die systemübergreifende Datenintegrität wichtig ist, insbesondere wenn Sie komplexe verteilte Transaktionen mit zweiphasigem Commit verwenden. Möglicherweise müssen Sie Ihre Transaktionen besser verwalten, als ein ORM unterstützen kann.

  • Hochleistungsanwendungen, bei denen Sie Ihren Datenbankzugriff wirklich optimieren möchten. In diesem Fall kann es vorzuziehen sein, auf einer niedrigeren Ebene zu arbeiten.

  • Situationen, in denen Sie einen etablierten Datenzugriffsmechanismus wie ADO.Net verwenden, der "gut genug" ist und gut mit der Plattform spielt, sind von größerem Nutzen als der ORM.

  • Manchmal sind Daten nur Daten - es kann beispielsweise der Fall sein, dass Ihre Anwendung mit "Transaktionen" und nicht mit "Objekten" arbeitet und dass dies eine sinnvolle Ansicht der Domäne ist. Ein Beispiel hierfür könnte ein Finanzpaket sein, bei dem Sie Transaktionen mit konfigurierbaren Analysefeldern haben. Während die Anwendung selbst auf einer OO-Plattform erstellt werden kann, ist sie nicht an ein einzelnes Geschäftsdomänenmodell gebunden und kennt möglicherweise nicht viel mehr als GL-Codes, Konten, Dokumenttypen und ein halbes Dutzend Analysefelder. In diesem Fall kennt die Anwendung kein Geschäftsdomänenmodell als solches und ein Objektmodell (über die Ledger-Struktur hinaus) ist für die Anwendung nicht relevant.


"oder andere Arten von Systemen, bei denen Datenintegrität wichtig ist" ... Abgesehen von sozialen Websites, wenn die Integrität Ihrer Daten nicht wichtig ist, warum sollten Sie sich überhaupt die Mühe machen, ein System aufzubauen?
ObiWanKenobi

3
Der Punkt bezieht sich speziell auf verteilte Transaktionen, bei denen mehrere Systeme ein Festschreiben oder Zurücksetzen synchron oder außerhalb einer Nachrichtenwarteschlange gewährleisten müssen. Nicht alle dieser Systeme werden für Sie erstellt und unterstützen daher nicht unbedingt ein ORM. Möglicherweise müssen Sie die Transaktionen explizit verwalten. Dies erfordert möglicherweise, dass Sie ein niedrigeres Takedlit als ein ORM verwenden.
ConcernedOfTunbridgeWells

1
Ich weiß, es ist über ein Jahr her, aber +1 für Sie, weil Sie die Tatsache erwähnt haben, dass Daten manchmal einfach nur Daten sind.
Luis.espinal

37

Zunächst einmal - die Verwendung eines ORM erleichtert weder das Testen Ihres Codes noch bietet es notwendigerweise Vorteile in einem Szenario mit kontinuierlicher Integration.

Nach meiner Erfahrung können die wichtigsten Probleme, die Sie angehen müssen, während die Verwendung eines ORM die Entwicklungsgeschwindigkeit erhöhen kann:

  1. Testen Sie Ihren Code
  2. Pflege Ihres Codes

Die Lösungen für diese sind:

  1. Machen Sie Ihren Code testbar (nach SOLID- Prinzipien)
  2. Schreiben Sie automatisierte Tests für so viel Code wie möglich
  3. Führen Sie die automatisierten Tests so oft wie möglich aus

Wenn Sie zu Ihrer Frage kommen, scheinen die beiden Einwände, die Sie auflisten, eher Unwissenheit als alles andere zu sein.

Die Tatsache, dass SELECT-Abfragen nicht von Hand geschrieben werden können (was vermutlich der Grund ist, warum das Kopieren und Einfügen erforderlich ist), scheint darauf hinzudeuten, dass dringend SQL-Schulungen erforderlich sind.

Es gibt zwei Gründe, warum ich kein ORM verwenden würde:

  1. Die Unternehmensrichtlinien verbieten dies strengstens (in diesem Fall würde ich woanders arbeiten gehen).
  2. Das Projekt ist äußerst datenintensiv und die Verwendung herstellerspezifischer Lösungen (wie BulkInsert) ist sinnvoller.

Die üblichen Ablehnungen bezüglich ORMs (insbesondere NHibernate) sind:

  1. Geschwindigkeit

    Es gibt keinen Grund, warum die Verwendung eines ORM langsamer ist als der handcodierte Datenzugriff. In der Tat kann es aufgrund des Caching und der darin enthaltenen Optimierungen schneller gehen. Ein guter ORM erzeugt eine wiederholbare Reihe von Abfragen, für die Sie Ihr Schema optimieren können. Ein gutes ORM ermöglicht auch das effiziente Abrufen zugehöriger Daten mithilfe verschiedener Abrufstrategien.

  2. Komplexität

    In Bezug auf die Komplexität bedeutet die Verwendung eines ORM weniger Code, was im Allgemeinen weniger Komplexität bedeutet. Viele Benutzer, die handgeschriebenen (oder Code-generierten) Datenzugriff verwenden, schreiben ihr eigenes Framework über Datenzugriffsbibliotheken auf "niedriger Ebene" (wie das Schreiben von Hilfsmethoden für ADO.Net). Diese sind komplexer und noch schlimmer, sie sind selten gut dokumentiert oder gut getestet.
    Wenn Sie sich speziell mit NHibernate befassen, erleichtern Tools wie Fluent NHibernate und Linq To NHibernate auch die Lernkurve.

Das, was mich an der gesamten ORM-Debatte interessiert, ist, dass dieselben Leute, die behaupten, dass die Verwendung eines ORM zu hart / langsam ist / was auch immer, dieselben Leute sind, die mit Linq To Sql oder typisierten Datensätzen mehr als zufrieden sind. Während Linq To Sql ein großer Schritt in die richtige Richtung ist, ist es noch Lichtjahre hinter einigen Open-Source-ORMs zurück. Die Frameworks sowohl für typisierte Datensätze als auch für Linq To Sql sind jedoch immer noch äußerst komplex, und es ist dumm, sie zu verwenden, um zu weit von (Tabelle = Klasse) + (Basis-CRUD) entfernt zu sein.

Mein Rat ist, wenn Sie am Ende des Tages kein ORM erhalten können, stellen Sie sicher, dass Ihr Datenzugriff vom Rest des Codes getrennt ist und dass Sie den Ratschlägen der Gang Of Four zum Codieren folgen eine Schnittstelle. Besorgen Sie sich auch ein Dependancy Injection-Framework, um die Verkabelung durchzuführen.

(Wie ist das für eine Schimpfe?)


33

Es gibt eine Vielzahl von häufigen Problemen, für die ORM-Tools wie Hibernate ein Geschenk Gottes sind, und einige, bei denen dies ein Hindernis darstellt. Ich weiß nicht genug über Ihr Projekt, um zu wissen, um welches es sich handelt.

Eine der Stärken von Hibernate ist, dass Sie Dinge nur dreimal sagen können: Jede Eigenschaft wird in der Klasse, der Datei .hbm.xml und der Datenbank erwähnt. Bei SQL-Abfragen befinden sich Ihre Eigenschaften in der Klasse, der Datenbank, den select-Anweisungen, den insert-Anweisungen, den update-Anweisungen, den delete-Anweisungen und dem gesamten Marshalling- und Unmarshalling-Code, der Ihre SQL-Abfragen unterstützt! Dies kann schnell chaotisch werden. Auf der anderen Seite wissen Sie, wie es funktioniert. Sie können es debuggen. Es ist alles in Ordnung in Ihrer eigenen Persistenzschicht, nicht im Darm eines Werkzeugs eines Drittanbieters vergraben.

Hibernate könnte ein Aushängeschild für Spolskys Gesetz der undichten Abstraktionen sein. Wenn Sie ein wenig abseits der ausgetretenen Pfade sind, müssen Sie die internen Funktionen des Tools genau kennen. Es kann sehr ärgerlich sein, wenn Sie wissen, dass Sie das SQL in wenigen Minuten hätten reparieren können, aber stattdessen verbringen Sie Stunden damit, Ihr Dang-Tool dazu zu bringen, vernünftiges SQL zu generieren. Das Debuggen ist manchmal ein Albtraum, aber es ist schwer, Leute zu überzeugen, die noch nicht dort waren.

BEARBEITEN: Möglicherweise möchten Sie einen Blick auf iBatis.NET werfen, wenn sie sich nicht um NHibernate kümmern und die Kontrolle über ihre SQL-Abfragen haben möchten.

EDIT 2: Hier ist die große rote Fahne: "Gute Praktiken, die beim Stapelüberlauf als ziemlich normal angesehen werden, wie z. B. Komponententests oder kontinuierliche Integration, gibt es hier bisher nicht." Also, diese "erfahrenen" Entwickler, was haben sie in der Entwicklung erlebt? Ihre Arbeitsplatzsicherheit? Es hört sich so an, als ob Sie zu den Leuten gehören, die sich nicht besonders für das Gebiet interessieren. Lassen Sie sie also nicht Ihr Interesse töten. Sie müssen das Gleichgewicht sein. Kämpfe.


3
Die Wiederholung ist nicht mehr wahr. Wenn Sie JPA-Anmerkungen verwenden, müssen Sie die Dinge nur einmal angeben. Hibernate erstellt sogar Ihre Datenbankerstellungsanweisungen für Sie, obwohl dies am nützlichsten ist, um festzustellen, ob Ihre Zuordnung korrekt war.
Jonathan-Stafford

Gute ausgewogene Diskussion der Themen. Meine Erfahrung mit dem Entity-Framework passt genau zu Ihrer Beschreibung von "Stunden damit verbringen, Ihr Dang-Tool zu überreden" und "Es ist schwer, Leute zu überzeugen, die noch nicht dort waren". Es war anscheinend schneller zu schreiben, aber es ist eine enorme Zeitverschwendung, um wirklich gute Leistungen zu erbringen.

2
8 Jahre sind vergangen, aber es ist immer noch wahr: "Es kann sehr ärgerlich sein, wenn Sie wissen, dass Sie das SQL in Minuten hätten reparieren können, aber stattdessen verbringen Sie Stunden damit, Ihr Dang-Tool dazu zu bringen, vernünftiges SQL zu generieren."
Ruslan Stelmachenko

13

Ich habe an einem Projekt gearbeitet, bei dem die Nichtverwendung eines ORM sehr erfolgreich war. Es war ein Projekt, das

  1. Musste von Anfang an horizontal skaleal sein
  2. Musste schnell entwickelt werden
  3. Hatte ein relativ einfaches Domain-Modell

Die Zeit, die benötigt worden wäre, um NHibernate in einer horizontal partitionierten Struktur zum Arbeiten zu bringen, wäre viel länger gewesen als die Zeit, die benötigt wurde, um einen supereinfachen Daten-Mapper zu entwickeln, der unser Partitionierungsschema kannte ...

In 90% der Projekte, an denen ich an einem ORM gearbeitet habe, war dies eine unschätzbare Hilfe. Es gibt jedoch einige sehr spezielle Umstände, unter denen ich die Verwendung eines ORM als am besten erachten kann.


Sie haben einige gute Punkte gegen die Verwendung eines ORM in bestimmten Fällen gegeben. Dieses Projekt gehört jedoch zu den 90%, bei denen das ORM möglicherweise dazu beitragen könnte, die Entwicklungs- und Wartungskosten zu senken.
Hangy

Stimme voll und ganz zu - entschuldige, dass du deine Frage nicht direkt beantwortet hast! Ich glaube, dass die spezifischen Gründe, die Sie erwähnt haben, ziemlich ungültig sind :)
Mike


11

Lassen Sie mich zunächst sagen, dass ORMs Ihr Entwicklungsleben erleichtern können, wenn sie ordnungsgemäß integriert werden. Es gibt jedoch eine Handvoll Probleme, bei denen das ORM Sie tatsächlich daran hindern kann, Ihre festgelegten Anforderungen und Ziele zu erreichen.

Ich habe festgestellt, dass ich beim Entwerfen von Systemen mit hohen Leistungsanforderungen häufig aufgefordert werde, Wege zu finden, um das System leistungsfähiger zu machen. Oft habe ich eine Lösung mit einem starken Schreibleistungsprofil (was bedeutet, dass wir viel mehr Daten schreiben als Daten lesen). In diesen Fällen möchte ich die Funktionen der Datenbankplattform nutzen, um unsere Leistungsziele zu erreichen (OLTP, nicht OLAP). Wenn ich also SQL Server verwende und weiß, dass ich viele Daten schreiben muss, warum sollte ich dann keine Masseneinfügung verwenden? Nun, wie Sie vielleicht bereits festgestellt haben, die meisten ORMS (ich weiß nicht, ob Selbst ein einziger hat nicht die Möglichkeit, plattformspezifische Vorteile wie Bulk-Einsätze zu nutzen.

Sie sollten wissen, dass Sie die ORM- und Nicht-ORM-Techniken mischen können. Ich habe gerade festgestellt, dass es eine Handvoll Randfälle gibt, in denen ORMs Ihre Anforderungen nicht unterstützen können, und Sie müssen sie für diese Fälle umgehen.


9

Wenn Sie 50000000 Datensätze aktualisieren müssen. Setze eine Flagge oder was auch immer.

Versuchen Sie dies mit einem ORM, ohne eine gespeicherte Prozedur oder native SQL-Befehle aufzurufen.

Update 1: Versuchen Sie auch, einen Datensatz mit nur wenigen Feldern abzurufen. (Wenn Sie einen sehr "breiten" Tisch haben). Oder ein skalares Ergebnis. ORMs saugen auch daran.

UPDATE 2 : Es scheint, dass EF 5.0 Beta Batch-Updates verspricht, aber dies sind sehr heiße Nachrichten (2012, Januar)



9

Für eine nicht triviale datenbankbasierte Unternehmensanwendung gibt es wirklich keine Rechtfertigung dafür, kein ORM zu verwenden.

Features beiseite:

  • Wenn Sie kein ORM verwenden, lösen Sie ein Problem, das bereits wiederholt von großen Communities oder Unternehmen mit erheblichen Ressourcen gelöst wurde.
  • Durch die Verwendung eines ORM profitiert der Kern Ihrer Datenzugriffsschicht von den Debugging-Bemühungen dieser Community oder dieses Unternehmens.

Berücksichtigen Sie die Vorteile der Verwendung von ADO.NET gegenüber dem Schreiben des Codes zum Parsen des tabellarischen Datenstroms.

Ich habe Unwissenheit über die Verwendung eines ORM gesehen, die die Verachtung eines Entwicklers für ORMs rechtfertigt. Zum Beispiel: eifriges Laden (etwas, das Sie bemerkt haben, haben Sie nicht erwähnt). Stellen Sie sich vor, Sie möchten einen Kunden und alle seine Bestellungen sowie alle Bestelldetails abrufen. Wenn Sie sich nur auf das verzögerte Laden verlassen, werden Sie Ihre ORM-Erfahrung mit der Meinung verlassen: "ORMs sind langsam." Wenn Sie lernen, wie man eifriges Laden verwendet, erledigen Sie in 2 Minuten 5 Codezeilen. Die Implementierung Ihrer Kollegen dauert einen halben Tag: eine Abfrage an die Datenbank und das Binden der Ergebnisse an eine Hierarchie von Objekten. Ein weiteres Beispiel wäre der Schmerz, SQL-Abfragen manuell zu schreiben, um Paging zu implementieren.

Die mögliche Ausnahme bei der Verwendung eines ORM wäre, wenn diese Anwendung ein ORM-Framework wäre, das für die Anwendung spezieller Abstraktionen der Geschäftslogik entwickelt wurde und für die Wiederverwendung in mehreren Projekten ausgelegt ist. Selbst wenn dies der Fall wäre, würden Sie eine schnellere Übernahme erhalten, wenn Sie ein vorhandenes ORM mit diesen Abstraktionen erweitern.

Lassen Sie sich nicht von der Erfahrung Ihrer hochrangigen Teammitglieder in die entgegengesetzte Richtung der Entwicklung der Informatik ziehen. Ich habe mich seit 23 Jahren beruflich weiterentwickelt, und eine der Konstanten ist die Verachtung des Neuen durch die alte Schule. ORMs beziehen sich auf SQL wie die C-Sprache auf Assembler, und Sie können darauf wetten, dass die Entsprechungen zu C ++ und C # auf dem Weg sind. Eine Zeile des New-School-Codes entspricht 20 Zeilen der Old-School.


8

Ich denke, wenn Sie auf größeren Systemen arbeiten, können Sie möglicherweise ein Codegenerator-Tool wie CodeSmith anstelle eines ORM verwenden ... Ich habe kürzlich Folgendes gefunden: Cooperator Framework, das gespeicherte SQL Server-Prozeduren generiert und auch Ihre Geschäftsentitäten, Mapper, Gateways, Lazyload und all das Zeug in C # ... check it out ... es wurde von einem Team hier in Argentinien geschrieben ...

Ich denke, es liegt in der Mitte zwischen dem Codieren der gesamten Datenzugriffsschicht und der Verwendung eines ORM ...


6

Persönlich habe ich mich (bis vor kurzem) gegen die Verwendung eines ORM ausgesprochen und mich daran gewöhnt, eine Datenzugriffsschicht zu schreiben, die alle SQL-Befehle enthält. Der größte Einwand gegen ORMs war, dass ich der ORM-Implementierung nicht vertraute, genau das richtige SQL zu schreiben. Und nach den ORMs zu urteilen, die ich früher gesehen habe (hauptsächlich PHP-Bibliotheken), denke ich, dass ich vollkommen recht hatte.

Jetzt verwendet der Großteil meiner Webentwicklung Django, und ich fand das enthaltene ORM sehr praktisch. Da das Datenmodell zuerst in seinen Begriffen und erst später in SQL ausgedrückt wird, funktioniert es perfekt für meine Anforderungen. Ich bin sicher, es wäre nicht zu schwer, daraus herauszuwachsen und muss mit handgeschriebenem SQL ergänzt werden. Für CRUD ist der Zugriff jedoch mehr als ausreichend.

Ich weiß nichts über NHibernate. aber ich denke, es ist auch "gut genug" für das meiste, was Sie brauchen. Aber wenn andere Programmierer ihm nicht vertrauen; Es wird ein Hauptverdächtiger bei jedem datenbezogenen Fehler sein, was die Überprüfung mühsamer macht.

Sie könnten versuchen, es schrittweise an Ihrem Arbeitsplatz einzuführen, indem Sie sich zunächst auf kleine „offensichtliche“ Anwendungen wie den einfachen Datenzugriff konzentrieren. Nach einer Weile wird es möglicherweise für Prototypen verwendet und möglicherweise nicht ersetzt ...


5

Wenn es sich um eine OLAP-Datenbank handelt (z. B. statische, schreibgeschützte Daten, die für Berichte / Analysen usw. verwendet werden), ist die Implementierung eines ORM-Frameworks nicht geeignet. Stattdessen wäre die Verwendung der nativen Datenzugriffsfunktionen der Datenbank, z. B. gespeicherter Prozeduren, vorzuziehen. ORMs eignen sich besser für Transaktionssysteme (OLTP).


Bist du dir da sicher? OLTPs sind für ORMs genauso ungeeignet wie OLAPs (ich meine, abhängig von der Komplexität). Zwischen diesen beiden Extremen gibt es eine Vielzahl von Anwendungen, für die ein ORM gute Arbeit leistet. Aber für OLAPs und OLTPs können sie ein Hindernis werden.
Luis.espinal

4

Ich denke, es gibt viele gute Gründe, kein ORM zu verwenden. In erster Linie bin ich ein .NET-Entwickler und halte mich gerne an das, was mir das wunderbare .NET-Framework bereits bietet. Es macht alles, was ich dazu brauche. Auf diese Weise bleiben Sie bei einem Standardansatz, und daher besteht eine viel bessere Chance, dass andere Entwickler, die später an demselben Projekt arbeiten, in der Lage sind, das zu erfassen, was sich dort befindet, und damit zu arbeiten. Die von Microsoft bereits bereitgestellten Datenzugriffsfunktionen sind recht umfangreich. Es gibt keinen Grund, sie zu verwerfen.

Ich bin seit 10 Jahren ein professioneller Entwickler, habe mehrere sehr erfolgreiche Projekte im Wert von über einer Million Dollar geleitet und noch nie eine Anwendung geschrieben, die in eine Datenbank wechseln musste. Warum sollten Sie jemals wollen, dass ein Kunde dies tut? Planen Sie sorgfältig, wählen Sie die richtige Datenbank für das aus, was Sie benötigen, und bleiben Sie dabei. Persönlich konnte SQL Server alles tun, was ich jemals tun musste. Es ist einfach und funktioniert hervorragend. Es gibt sogar eine kostenlose Version, die bis zu 10 GB Daten unterstützt. Oh, und es funktioniert fantastisch mit .NET.

Ich musste kürzlich an mehreren Projekten arbeiten, die ein ORM als Datenschicht verwenden. Ich denke, es ist schlecht, und ich musste lernen, wie man es ohne Grund benutzt. In dem wahnsinnig seltenen Fall, dass der Kunde die Datenbanken ändern musste, hätte ich die gesamte Datenschicht in kürzerer Zeit problemlos überarbeiten können, als ich es mit den ORM-Anbietern getan habe.

Ehrlich gesagt denke ich, dass es eine echte Verwendung für ein ORM gibt: Wenn Sie eine Anwendung wie SAP erstellen, die wirklich die Fähigkeit benötigt, auf mehreren Datenbanken ausgeführt zu werden. Ansonsten sage ich meinen Kunden als Lösungsanbieter, dass diese Anwendung für die Ausführung in dieser Datenbank ausgelegt ist, und so ist es auch. Nach 10 Jahren und unzähligen Anwendungen war dies erneut kein Problem.

Ansonsten denke ich, dass ORMs für Entwickler gedacht sind, die nicht verstehen, dass weniger mehr ist. Je mehr coole Tools von Drittanbietern sie in ihrer App verwenden, desto besser wird ihre App. Ich überlasse solche Dinge den eingefleischten Überfreaks, während ich in der Zwischenzeit viel mehr großartige Software herausbringe, mit der jeder Entwickler sofort produktiv sein kann.


2
Ich verstehe wirklich nicht, warum diese Antwort abgelehnt wird. Es ist eine gute Übung, es einfach zu halten, indem Sie alles verwenden, was Ihre Umgebung zu bieten hat. Als erfahrener Guru für sauberen Code finde ich, dass Orms schwer zu lesen und daher schwer zu pflegen sind. Sie wissen nicht genau, welche Abfragen ausgeführt werden, wenn Ihre Anwendung komplexe Beziehungen aufweist (was Sie eventuell tun werden). Es wird auf lange Sicht unmöglich, ein solches Durcheinander zu beheben. Ich sage, halte es einfach, benutze kein ORM.
David

Das ist lustig. Ich bin seit 24 Jahren Entwickler und war noch nie an einem Projekt beteiligt, bei dem nur ein RDBMS-Anbieter unterstützt werden konnte. Für jedes Projekt mussten wir mehrere RDBMS-Anbieter unterstützen, da wir flexibel genug sein mussten, um mit Kunden zusammenzuarbeiten, die Oracle benötigen, und mit anderen Kunden, die SQL Server benötigen. Wenn Sie eine Ofenrohranwendung im luftleeren Raum erstellen, können Sie das RDBMS einfach diktieren. Aber ich war noch nie an einem Projekt beteiligt, bei dem das akzeptabel war.
Deltamind106

Ich hatte viele Anwendungen, in denen ich das RDBMS diktieren kann, hauptsächlich, weil bei einer großen Anzahl interner Anwendungen und Kunden, die "unsere" Daten betrachteten. Ich bin auch seit 24 Jahren Entwickler.
Jeffkenn

3

Die Laufzeitleistung ist der einzige wirkliche Nachteil, den ich mir vorstellen kann, aber ich denke, das ist mehr als ein fairer Kompromiss für die Zeit, die ORM Ihnen beim Entwickeln / Testen / etc. Spart. In den meisten Fällen sollten Sie in der Lage sein, Datenengpässe zu lokalisieren und Ihre Objektstrukturen effizienter zu gestalten.

Ich habe Hibernate noch nicht verwendet, aber eine Sache, die mir bei einigen ORM-Lösungen von der Stange aufgefallen ist, ist mangelnde Flexibilität. Ich bin sicher, das hängt davon ab, mit was Sie gehen und was Sie damit machen müssen.


Ich erinnere mich an einige Leute, die sagten, dass die optimierten Abfragen und das Nichtladen von Daten, die in bestimmten Situationen nicht erforderlich sind (dh das verzögerte Laden von Joins), die Dinge tatsächlich beschleunigen können. Die manuelle Implementierung in einem benutzerdefinierten DAL ist möglicherweise mehr Arbeit und weniger Zeit wert.
Hangy

3

Es gibt zwei Aspekte von ORMs, die besorgniserregend sind. Erstens handelt es sich um Code, der von jemand anderem geschrieben wurde, manchmal als Closed Source, manchmal als Open Source, aber mit großem Umfang. Zweitens kopieren sie die Daten.

Das erste Problem verursacht zwei Probleme. Sie verlassen sich auf Code von Außenstehenden. Wir alle tun dies, aber die Entscheidung dafür sollte nicht leichtfertig getroffen werden. Und was ist, wenn es nicht das tut, was Sie brauchen? Wann wirst du das entdecken? Sie wohnen in der Box, die Ihr ORM für Sie zeichnet.

Das zweite Problem ist eines von zwei Phasen-Commits. Die relationale Datenbank wird in ein Objektmodell kopiert. Sie ändern das Objektmodell und es soll die Datenbank aktualisieren. Dies ist ein zweiphasiges Commit und nicht das einfachste Debugging.


2
Umm ... wenn Sie beispielsweise .NET verwenden, verlassen Sie sich auf deren Code (den Sie nicht ändern können). Ich sehe nicht, dass das "ok" ist, als sich zum Beispiel auf den Code von NHibernate zu verlassen. Es ist relativ lächerlich, paranoid gegenüber Bibliotheken zu sein, die Sie nicht selbst geschrieben haben. Klingt so, als ob Sie an NIH leiden
Jason Bunting

Compiler und VMs sind ein relativ stabiler Bestandteil von CS und mit Tests nicht so schwer zu beantworten. Ein ORM-Design kann auf viele Arten "leicht falsch" oder unvollständig dokumentiert werden. All dies macht es schwieriger zu vertrauen als etwas so Grundlegendes wie der Compiler.
Javier

1
Es ist eine Warnung ... keine Anweisung, die nicht verwendet wird. Und das ist nur eine Warnung von drei Problemen.
Dacracot

1
@dacracot: Sie verlassen sich ständig auf viele fremde Codes ... ausgehend von Ihrem Betriebssystem, daher denke ich nicht, dass Ihr Standpunkt gültig ist. Der zweite Punkt kann durch optimistisches Sperren gemildert werden, außerdem hat er nicht viel mit zweiphasigem Festschreiben zu tun.
Adam Byrtek

1
Dacracot ist genau richtig, wenn es um einige der weniger ausgereiften ORMs geht. Ich bin mir sicher, dass es einige Rockbälle gibt, aber die meisten werden unvollkommen sein, und es kann in einigen (nicht den meisten) Umgebungen ein Problem sein. In Bezug auf das zweiphasige Festschreiben ... gibt es Möglichkeiten, die DB-Transaktion selbst im Code zu modellieren. Warum sollte jedoch eine Indirektionsebene hinzugefügt werden, die keine Abstraktion bietet?
Tom


3

Die Erfahrung, die ich mit Hibernate gemacht habe, ist, dass seine Semantik subtil ist und wenn es Probleme gibt, ist es ein bisschen schwer zu verstehen, was unter der Haube falsch läuft. Ich habe von einem Freund gehört, dass man oft mit Kriterien beginnt, dann etwas mehr Flexibilität und HQL benötigt und später bemerkt, dass schließlich unformatiertes SQL benötigt wird (zum Beispiel hat Hibernate keine Union AFAIK).

Auch bei ORM neigen Benutzer leicht dazu, vorhandene Zuordnungen / Modelle zu überbeanspruchen, was dazu führt, dass es ein Objekt mit vielen Attributen gibt, die nicht initiiert sind. Nach der Abfrage führt Hibernate innerhalb der Transaktion zusätzlichen Datenabruf durch, was zu einer möglichen Verlangsamung führt. Leider wird das Modellobjekt im Ruhezustand manchmal in die Ansichtsarchitekturschicht übertragen, und dann werden LazyInitializationExceptions angezeigt.

Um ORM zu verwenden, sollte man es wirklich verstehen. Leider bekommt man leicht den Eindruck, dass es einfach ist, während es nicht ist.


Der Ruhezustand unterstützt UNION nicht? Das ist ein ziemlich grundlegender Teil der Mengenlehre! Ich nehme an, es zeigt nur eine andere Art, über das Problem nachzudenken.
Tom

3

Um an sich keine Antwort zu sein, möchte ich ein Zitat umformulieren, das ich kürzlich gehört habe. "Ein guter ORM ist wie ein Yeti, jeder spricht über einen, aber niemand sieht ihn."

Immer wenn ich ein ORM in die Hand nehme, habe ich normalerweise Probleme mit den Problemen / Einschränkungen dieses ORM. Am Ende macht es ja, was ich will und es wurde irgendwo in dieser miesen Dokumentation geschrieben, aber ich verliere eine weitere Stunde, die ich nie bekommen werde. Jeder, der nhibernate und dann fließend nhibernate auf postgresql verwendet hat, würde verstehen, was ich durchgemacht habe. Das ständige Gefühl "dieser Code ist nicht unter meiner Kontrolle" ist wirklich scheiße.

Ich zeige nicht mit den Fingern oder sage, dass sie schlecht sind, aber ich begann darüber nachzudenken, was ich verrate, nur um CRUD in einem einzigen Ausdruck zu automatisieren. Heutzutage denke ich, ich sollte weniger ORMs verwenden, vielleicht eine Lösung erstellen oder finden, die mindestens DB-Operationen ermöglicht. Aber es ist nur ich. Ich glaube, einige Dinge sind in dieser ORM-Arena falsch, aber ich bin nicht geschickt genug, um auszudrücken, was nicht.


Viele Jahre (und ORMs) später entschied ich mich für Postgresql / EntityFramework mit Code First Migrations. Damit kann ich die Datenpersistenz über von mir geschriebene Klassen aktivieren und endlich meine in meine Produktionsumgebung integrierten Datenbankänderungen synchronisieren / versionieren. Es ist fast eine transparente Ebene des Datenzugriffs und spart viel Zeit während der Entwicklung, aber in der Zwischenzeit kann ich tief gehen und erweiterte Abfragen schreiben, wenn ich möchte. Natürlich ist es eine Dotnet-Lösung, aber ich bin endlich mit dem Datenbankzugriff zufrieden.
Detay

2

Ich denke, dass die Verwendung eines ORM immer noch eine gute Idee ist. Besonders in Anbetracht der Situation, die Sie geben. Es klingt nach Ihrem Beitrag, dass Sie in Bezug auf die Datenbankzugriffsstrategien umso erfahrener sind, und ich würde die Verwendung eines ORM ansprechen.

Es gibt kein Argument für Nr. 1, da das Kopieren und Einfügen von Abfragen und das Hardcodieren in Text keine Flexibilität bietet. Für Nr. 2 wird die ursprüngliche Ausnahme umbrochen, die Nachverfolgung der generierten Abfragen usw. ermöglicht, sodass das Debuggen auch kein Hexenwerk ist.

Bei der Validierung erleichtert die Verwendung eines ORM in der Regel auch die Entwicklung von Validierungsstrategien erheblich, zusätzlich zu den integrierten Validierungen.

Das Schreiben eines eigenen Frameworks kann mühsam sein und oft werden Dinge übersehen.

EDIT: Ich wollte noch einen Punkt machen. Wenn Ihr Unternehmen eine ORM-Strategie anwendet, erhöht dies seinen Wert weiter, da Sie Richtlinien und Praktiken für die Verwendung und Implementierung entwickeln und jeder sein Wissen über das ausgewählte Framework weiter verbessert, wodurch eines der von Ihnen angesprochenen Probleme gemindert wird. Außerdem lernen Sie, was funktioniert und was nicht, wenn Situationen auftreten, und am Ende sparen Sie viel Zeit und Mühe.


1

Jedes ORM, auch ein "gutes", enthält eine Reihe von Annahmen, die sich auf die zugrunde liegenden Mechanismen beziehen, mit denen die Software Daten zwischen Ihrer Anwendungsschicht und Ihrem Datenspeicher hin und her überträgt.

Ich habe festgestellt, dass das Umgehen dieser Annahmen für mäßig anspruchsvolle Anwendungen normalerweise mehr Zeit in Anspruch nimmt als das einfache Schreiben einer einfacheren Lösung, z. B.: Abfragen der Daten und manuelles Instanziieren neuer Entitäten.

Insbesondere werden Sie wahrscheinlich auf Probleme stoßen, sobald Sie mehrspaltige Schlüssel oder andere mäßig komplexe Beziehungen verwenden, die außerhalb des Bereichs der praktischen Beispiele liegen, die Ihnen Ihr ORM beim Herunterladen des Codes zur Verfügung gestellt hat.

Ich gebe zu, dass für bestimmte Arten von Anwendungen, insbesondere für Anwendungen mit einer sehr großen Anzahl von Datenbanktabellen oder dynamisch generierten Datenbanktabellen, der Auto-Magic-Prozess eines ORM nützlich sein kann.

Ansonsten zur Hölle mit ORMs. Ich betrachte sie jetzt im Grunde genommen als Modeerscheinung.

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.