Ich beginne, das von dem von mir gewählten Framework empfohlene ORM zu verwenden, und obwohl mir die Idee der zusätzlichen Abstraktionsebene, die das ORM bietet, gefällt, beginne ich zu erkennen, was dies wirklich bedeutet. Es bedeutet, dass ich nicht mehr mit meiner Datenbank (MySQL) arbeite und alle MySQL-spezifischen Funktionen verschwunden sind, als ob sie nicht existieren.
Die Idee des ORM ist, dass es versucht, mir zu helfen, indem es alles datenbankunabhängig macht. Das hört sich toll an, aber oft gibt es einen Grund, warum ich mich für ein bestimmtes Datenbanksystem entscheide. Auf dem Weg der Datenbankunabhängigkeit nimmt der ORM jedoch den kleinsten gemeinsamen Nenner, was bedeutet, dass ich am Ende die kleinsten Funktionen habe (die von allen Datenbanken unterstützt werden).
Was ist, wenn ich weiß, dass ich die zugrunde liegende Datenbank langfristig nicht wechseln werde? Warum nicht auch auf die datenbankspezifischen Funktionen zugreifen?
quelle
Antworten:
Ich sehe es genauso. Jede Abstraktion, die es Ihnen nicht erlaubt, bei Bedarf darunter zu gelangen, ist böse, weil sie zu allerlei hässlichen Abstraktionsinversionen in Ihrem Code führt.
Bei der Arbeit haben wir ein selbst entwickeltes ORM, das ziemlich gut funktioniert, aber in Zeiten, in denen wir etwas brauchen, das seine Funktionen nicht explizit vorsehen, gibt es eine Methode, die einen String nimmt und ihn direkt in die Abfrage einfügt, die er generiert für die Verwendung von Raw-SQL, wenn es notwendig ist.
IMO ist jeder ORM, der diese Funktion nicht besitzt, die Bits nicht wert, aus denen er kompiliert wurde.
quelle
drops it directly into the query it's generating
Hört sich interessant an. Wissen Sie, wie lange es gedauert hat, dieses ORM zu schreiben? Ich würde so etwas gerne in einem der Open-Source-ORMs sehen.Ich muss mit Ihrer Aussage nicht einverstanden sein. Ich werde nHibernate als Beispiel nehmen. Dieses Framework unterstützt viele Datenbanken, einschließlich der beliebtesten, unabhängig von der Version (und den unterstützten Funktionen), genau wie die meisten ORMs.
Kurzer Hinweis: Sie erwähnen nur die Datenbankabstraktion. Das ist einer der vielen Vorteile, aber ich denke wirklich, dass objektorientierte Funktionen leistungsfähiger sind (z. B. Vererbung). Und
You design your domain model first
...... Zurück zur Abstraktion. Es ist nicht der kleinste gemeinsame Nenner. In nHibernate haben Sie Dialekte. Sie können denselben Code zum Abfragen verschiedener Datenbanken verwenden. Dialekte übernehmen für Sie das Feature-Management. Die richtige Aussage ist das
a given dialect will try to use all the power of a given database system
.SqlServer2005
Nehmen wir als Beispiel den Dialekt, der bei seiner Einführung die neuen SQL Server 2005-Paging-Funktionen nutzte. Wenn Sie diesen Dialekt verwenden, anstattSqlServer2000
nur Ihre Leistung zu steigern.Natürlich gibt es Ausnahmen, aber in vielen Jahren der Arbeit mit nHibernate bin ich auf keine einzige gestoßen, und meine Anwendungen sind sehr datenzentriert.
quelle
Die Idee ist ordentlich, aber ich bin noch nie so weit gekommen, ein ORM-Tool zu verwenden. Es war einfach kein Problem für mich, die SQL selbst zu schreiben (oder mit dem verwendeten Speicher umzugehen). Aber ich habe den Luxus, an einer kleineren Anzahl von Projekten mit längeren Produktlebensdauern zu arbeiten. Sobald die handcodierte SQL- und DB-Manipulation vorhanden ist, ist sie vorhanden. Außerdem können Sie dann natürlich alle direkten SQL-Abfragen bearbeiten, die Sie benötigen, ohne Ihren Prozess in die Denkweise des ORM-Tools einpassen zu müssen.
Ich denke also, die Fragen sollten lauten, bevor Sie sich auf eine stürzen:
Profitieren Sie tatsächlich von ihrer Verwendung? Sparen Sie also einen ausreichenden Aufwand, indem Sie ein ORM-Tool implementieren, damit es sich lohnt, es zu verwenden, und damit es sich lohnt, Ihrem System eine zusätzliche Komplikation hinzuzufügen? (Dies gilt insbesondere für kommerzielle Apps, bei denen dieses zusätzliche Teil jetzt ein zusätzlicher Vektor für potenzielle Supportprobleme ist.)
Und wird sich dann die zusätzliche Abstraktionsebene negativ auf die App auswirken? Wird es langsamer als handcodiertes SQL usw. sein?
quelle
O / RM wurde regelmäßig kritisiert. Ted Neward nannte es vor einigen Jahren das " Vietnam der Informatik ". O / RM
Sofern Sie nicht einfach ein eigenes Ad-hoc-Mapping schreiben (was in vielen Fällen eine gute Lösung ist, wie andere bereits gesagt haben), könnten Sie Alternativen wie die Verwendung einer nicht relationalen Datenbank in Betracht ziehen. Einige sagen, dass eine echte Objektdatenbank besser ist, andere Schlagworte, die in diesem Zusammenhang erwähnt werden, sind LINQ, Ruby und Tutorial D. Ich nehme an, dass es im Gegensatz zu echten relationalen Datenbanken echte Objektdatenbanken gibt. In der Praxis stellte ich jedoch fest, dass die konzeptionelle Datenmodellierung - dh herauszufinden, über welche Objekte der realen Welt Sie Daten speichern möchten und in welcher Beziehung diese Objekte zueinander stehen - wichtiger ist als das Herausfinden, wie Sie Ihr konzeptionelles Modell in einem beliebigen Modell ausdrücken können Programmier- oder Datenbanksprache.
quelle
Was ist die Alternative?
Dies ist eine interessante Vorstellung. Indem wir die Funktionen der zugrunde liegenden Datenbank abstrahieren, verlieren wir definitiv einige der Funktionen der spezifischen Datenbankimplementierung. (Ob wir von bestimmten Datenbankfeatures abhängen sollen oder nicht, ist ein weiteres Argument.) Ich denke, dies könnte durch datenbankspezifische ORMs gelöst werden, mit denen Sie auf die spezifischen Features zugreifen können falsche Richtung.
Am Ende des Tages müssen Sie sich fragen - was ist die Alternative?
Sollten wir die Verwendung von ORMs einstellen und den gesamten Datenbankzugriff selbst schreiben? Sicher, wir verlieren möglicherweise den Zugriff auf einige Datenbankfunktionen über den ORM, aber Sie können immer auf diese zugreifen, wenn Sie Techniken der alten Schule verwenden. Am Ende überwiegen die Produktivitätsgewinne die Nachteile.
quelle
Ein ORM entspricht grundsätzlich " Unstored Procedures ". Dort habe ich einen Begriff geprägt.
Alles, was ein ORM macht, können Sie mit Views, Triggern und Stored Procedures replizieren. Sie helfen dabei, unformatiertes SQL zu abstrahieren, und können normalisierte Datenbanken konsistent halten. Aber es funktioniert nur in einfachen Fällen. Wenn es zu mach Daten gibt, um sie zu verarbeiten, können sie zu einem Leistungsabfall werden. (ORMs in PHP beziehen sich häufig auf das Datenskript, da die SQL Builder-Ketten nicht alles abstrahieren können.)
Aber wie immer kommt es auf die jeweilige Anwendung und Aufgabe an.
quelle
Eine Sache, die bei der Verwendung von ORMs weh tut, ist, dass viele ihrer Fans behaupten, wir müssten die SQL- und RDB-Theorie nicht mehr kennen. Die Ergebnisse variieren von lustig bis total katastrophal. Und dies trotz der Millionen Male, die ORM herstellt und Experten behaupten, dass wir die SQL- und RDB-Theorie gut kennen müssen, um ein ORM richtig zu verwenden und zu konfigurieren.
Warum Menschen ein Werkzeug, das für viele, aber nicht für alle Kontexte von Nutzen ist, in eine magische, universell einsetzbare Silberkugel umwandeln, ist mir ein Rätsel.
quelle
Letztes Jahr habe ich an einer Inhouse-App gearbeitet, die sich häufig geändert hat, und ich war sehr froh, dass wir ein ORM verwendet haben. Die App war eine unterstützende App für ein Change Management-Team, und als sich das größere Projekt weiterentwickelte, stellte unsere kleine App neue Anforderungen an Situationen, die nicht existierten und einige Monate zuvor nicht vorhergesehen werden konnten.
Dank des ORM ( Propel , in PHP) haben wir einen Teil der Logik für den Code aufgeteilt, sodass eine Funktion den Teil "Ist Datensatz gültig" der Abfrage hinzufügte, eine andere den Sicherheitsteil ("Diese Datensätze nur anzeigen, wenn der Benutzer dies tut.") hat diese Fähigkeiten "), ... Wenn sich die zugrunde liegende Struktur geändert hat (ein zusätzliches Feld, das für die" Gültigkeit von Datensätzen "berücksichtigt werden sollte), mussten wir nur eine Funktion ändern, nicht zwanzig SQL-Klauseln.
Wir kamen aus einer Situation, in der alle (nun, die meisten) SQL-Klauseln in einer separaten XML-Datei gespeichert waren, sodass "Datenbankänderungen einfach zu handhaben wären". Glauben Sie mir, das waren sie nicht. Ein Teil war so schrecklich, dass ich ihn The Daily WTF vorlegen musste .
Wenn eine Abfrage zu kompliziert war, um sie mit Propel Criteria auszudrücken, oder wenn wir einige herstellerspezifische Funktionen benötigten (hauptsächlich Volltextsuche, da wir MySQL verwendeten), war dies mit Propel kein Problem. Sie können benutzerdefinierte Kriterien hinzufügen oder bei Bedarf Roh-SQL verwenden ( jetzt noch einfacher mit tatsächlichen Propel-Objekten zu kombinieren ). Sie können Ihre herstellerspezifischen Add-Ons problemlos zu den generierten Klassen hinzufügen, sodass Sie das Beste aus beiden Welten haben: Kein SQL in Ihrem Anwendungscode, aber mit allen Funktionen Ihres Datenbankmoduls.
quelle
Aber der Punkt ist, dass Sie sich von der Datenbank entfernen können, was bedeutet, dass Sie nicht so denken müssen, als wären Sie in der Datenbank.
Ich arbeite jetzt in C # und benutze LINQ sehr oft, also sehr viele fließende Methoden. Ich muss nicht darüber nachdenken, wie meine Objekte auf Programmebene gespeichert oder gefunden oder gar gespeichert werden, und auf der Ebene der Geschäftsschicht nur sehr wenig.
Sehr oft werden die von den spezifischen Datenbanken selbst bereitgestellten Methoden im DB Connector verwendet, sodass Sie diese Optimierungen erhalten, ohne wissen zu müssen, um welche es sich handelt.
Sie können weiterhin Funktionen DB-seitig schreiben. Oft kann man sie einfach durchmappen.
Und vor allem ermöglicht eine solche Trennung die Testbarkeit und zwingt Sie (ein wenig) dazu, besser strukturierten Code zu schreiben
quelle
Mit ORMs können Sie auch auf datenbankspezifische Funktionen zugreifen. Dies hängt davon ab, welches ORM Sie verwenden und welche Funktionen es bietet.
Zum Beispiel verwenden wir im aktuellen Projekt, an dem ich arbeite, die Java-Persistenz-API und den Ruhezustand. Trotzdem verwenden wir einige datenbankspezifische Funktionen, wie z. B. die Suche in Tabellen mit Soundex.
Für mich ist der Hauptvorteil der Verwendung eines ORM nicht unbedingt, dass eine Anwendungsdatenbank agnostisch wird (obwohl dies auch eine gute Sache ist), sondern dass ich größtenteils nicht darüber nachdenken muss, wie Dinge gespeichert werden und abgerufen.
Aber an einem gewissen Punkt werden Sie wahrscheinlich über diese ohnehin denken, je nach den Anforderungen für Ihre Anwendung. Das ORM ist keine Magie.
quelle
Ich habe meine eigene geschrieben, was mir das Auswählen und Einfügen erleichtert.
Jede db-spezifische Sache ist verfügbar. Ich muss nur die Abfrage selbst schreiben, bei der mir die Bibliothek hilft (ich kann '?' Und params verwenden, anstatt manuell einen Parameter zu benennen und .Add zu verwenden).
Ich denke, meine Hälfte ist zum Kotzen, zur Hälfte nützlich. Ich bekomme Hilfe in der ORM-Welt und übernehme wichtige Aufgaben in der Abfragewelt.
quelle
Das Schreiben von Code zum Einfügen und Auswählen, Aktualisieren inline oder mit gespeicherten Prozessen und das Zurückmappen über die DAL ist länger die Norm, eher nur in Ausnahmefällen von Vorteil. Die verfügbaren ORMs, die unterstützenden Datenbanken und Sprachen sind die Frage, die Sie sich stellen sollten, warum Sie ORM nicht verwenden.
Sie sind standardisiert, universell, entweder spezifiziert oder generisch. Außerdem ist es schneller und einfacher zu implementieren. Ich habe Subsonic, Linq-to-SQL und das Entity-Framework verwendet. Der Entwickler kann sich statt auf die Datenbankzuordnung auf die Logik und die Geschäftsregeln konzentrieren.
quelle
Meine (einfachen) zwei Cent:
1: Es gibt ORMS und es gibt ORMS. Einige ORMS basieren auf Active Record, andere auf Data Mapper - dies ist an sich eine relevante Überlegung, die jedoch einige Untersuchungen erfordert, um die Auswirkungen zu verstehen. Im Allgemeinen - meine Erfahrung in PHP ist, dass ORMS das erstere unterstützt, nur wenige das letztere. Active Record-basierte ORMs scheinen einen von zwei Effekten zu haben: Sie de-normalisieren entweder die Datenbank oder rufen eine Vielzahl von Klassen auf, um Objektinteraktionen zu unterstützen.
2: Der Vorteil von ORMs verringert sich in direkter Korrelation mit der Komplexität der Abfrage, die Sie ausführen müssen. Wenn Sie eine nette, einfache Beziehung haben - dh Benutzer -> Beiträge, können sie sehr gut funktionieren. Aus diesem Grund (IMO) verwenden die meisten ORMs / Frameworks Beispiele wie dieses. Wenn Sie jedoch komplexe Abfragen ausführen müssen, ist die Menge an ORMQL, die Sie generieren müssen, vergleichbar mit der String-Länge einer regulären SQL-Abfrage - jedoch weniger performant, da das Objektdiagramm, das die Abfrage ausführt, den Punkt besiegt Abstraktion. Kurz gesagt: ORMs sind hervorragend für die ersten 30-50% Ihrer Datenbankaufgaben - aber für die letzten schrecklich. Ich denke, dies ist ein weiterer Grund, warum AR so weit verbreitet ist.
3: Warum aus der Datenbank verstecken? Würden Sie eine serverseitige Sprache verwenden, um Javascript zu abstrahieren?
Persönlich mische ich diese Ansätze:
Nachdem das alles gesagt ist, erscheint Doctrine 2 in Kürze, was wirklich interessant aussieht.
quelle
Sie können SQL Mapper-Frameworks wie myBatis verwenden, wenn Sie SQL-Funktionen verwenden möchten.
quelle