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:
- Sie können einfach Ihre eigenen Datenzugriffsobjekte mit SQL-Abfragen erstellen und diese Abfragen aus Microsoft SQL Server Management Studio kopieren.
- Das Debuggen eines ORM kann schwierig sein.
Natürlich könnte ich meine Datenzugriffsschicht einfach mit vielen SELECT
s 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
, INSERT
und UPDATE
Abfragen 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.)
quelle
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.
quelle
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.
quelle
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:
Die Lösungen für diese sind:
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:
Die üblichen Ablehnungen bezüglich ORMs (insbesondere NHibernate) sind:
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.
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?)
quelle
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.
quelle
Ich habe an einem Projekt gearbeitet, bei dem die Nichtverwendung eines ORM sehr erfolgreich war. Es war ein Projekt, das
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.
quelle
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.
quelle
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)
quelle
Für eine nicht triviale datenbankbasierte Unternehmensanwendung gibt es wirklich keine Rechtfertigung dafür, kein ORM zu verwenden.
Features beiseite:
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.
quelle
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 ...
quelle
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 ...
quelle
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).
quelle
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.
quelle
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.
quelle
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.
quelle
Ich schlage diese Lektüre für eine Liste der Nachteile von ORMs vor.
http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx
Für mich selbst habe ich ORMs für die meisten Anwendungen, die ich geschrieben habe, sehr nützlich gefunden!
/ Asger
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle