Frage

Ich höre oft Leute ORMs für sein unflexibel und eine „undichte Abstraktion“, aber man wirklich nicht hören Warum sie sind problematisch Bashing. Bei sachgemäßer Anwendung, was genau sind die Fehler von ORMs? Ich frage das, weil ich auf einem PHP gerade arbeite orm und ich mag es Probleme zu lösen, dass viele andere ORMs scheitern an, wie verzögertes Laden und das Fehlen von Unterabfragen.

Bitte spezifisch mit Ihren Antworten. Zeigen Sie etwas Code oder ein Datenbankschema beschreiben, wo ein ORM Kämpfe. Nicht die Sprache oder die ORM Rolle.

War es hilfreich?

Lösung

Eines der größeren Probleme ich mit allen ORMs bemerkt habe ich verwendet habe, ist nur ein paar Felder zu aktualisieren, ohne zuerst das Objekt abgerufen werden.

Zum Beispiel, sagen, ich habe ein Objekt Projekt kartiert in der Datenbank mit den folgenden Feldern: ID, Name, Beschreibung, owning_user. Sprich durch Ajax, möchte ich das Beschreibungsfeld nur aktualisieren. In den meisten ORMs für mich die einzige Möglichkeit, die Datenbanktabelle zu aktualisieren, während nur eine ID und Beschreibung Werte aufweist, ist entweder das Projekt Objekt aus der Datenbank abzurufen, legen Sie die Beschreibung und dann das Objekt wieder an die Datenbank senden (was somit zwei Datenbankoperationen nur für ein einfaches Update) oder über gespeicherte Prozeduren zu aktualisieren (die Methode, die ich bin derzeit mit).

Andere Tipps

Objekte und Datenbankeinträge sind wirklich nicht allzu ähnlich. Sie haben Schlitze getippt, dass Sie Sachen speichern kann in, aber das war es. Datenbanken hat eine völlig andere Vorstellung von Identität als Programmiersprachen. Sie können nicht zusammengesetzte Objekte gut im Griff, so dass Sie stattdessen zusätzliche Tabellen und Fremdschlüssel verwenden. Die meisten haben keine Vorstellung vom Typ Vererbung. Und die natürliche Art und Weise ein Netzwerk von Objekten (folgt einige der Zeiger in einem Objekt, ein anderes Objekt bekommen, und dereferenzieren wieder) zu navigieren ist viel weniger effizient, wenn in der Datenbank Welt abgebildet, da Sie mehrere Umläufe machen müssen und Abrufen von vielen die Daten, die Sie nicht gleichgültig sind.

Mit anderen Worten: die Abstraktion kann nicht sehr gut in erster Linie gemacht werden; es ist nicht die ORM-Tools, die schlecht sind, aber die Metapher, dass sie umzusetzen. Statt einen perfekt Isomorphismus ist, ist es nur eine oberflächliche Ähnlichkeit, so dass die Aufgabe selbst nicht eine sehr gute Abstraktion ist. (Es ist immer noch viel nützlicher als mit Datenbanken vertraut zu verstehen, though. Die Verachtung für ORM-Tools kommen überwiegend aus DBAs nach unten auf bloßen Programmierer.)

ORMs kann auch Code schreiben, der nicht effizient ist. Da die Performance der Datenbank zu den meisten Systemen kritisch ist, können sie Probleme verursachen, wenn ein Mensch den Code geschrieben hätte vermieden werden können (die aber nicht besser hätte sein können, wenn der Mensch in Frage nicht verstehen, Datenbank-Performance-Tuning). Dies gilt insbesondere, wenn der anfragende wird komplex.

Ich glaube, mein größtes Problem mit sich ist aber, dass die Details von abstrahiert weg, Junior-Programmierer werden immer weniger Verständnis dafür, wie Abfragen zu schreiben, die sie benötigen, um die Grenzfälle und die Orte der Lage sein zu handhaben, wo das ORM wirklich schreibt fehlerhafter Code. Es ist wirklich schwer, die erweiterte Sachen zu lernen, wenn Sie nie die Grundlagen zu verstehen haben. Ein ORM in die Hände von jemandem, der durch und erweiterte Abfrage- verbindet und Gruppe versteht, ist eine gute Sache. In den Händen von jemandem, der nicht Boolesche Algebra und schließt sich und ein paar anderen grundlegenden SQL-Konzepte nicht versteht, ist es eine sehr schlechte Sache was zu einem sehr schlechtem Design der Datenbank und Abfragen.

Relationale Datenbanken sind nicht Objekte und nicht als solche behandelt werden soll. Der Versuch, einen Adler in eine Seidenhandtasche zu machen ist in der Regel nicht erfolgreich. Weit besser zu lernen, was der Adler ist gut und warum und läßt die Adler fliegen als einen schlechten Geldbeutel und einen toten Adler haben.

So wie ich es sehe, ist so. Um ein ORM zu verwenden, müssen Sie in der Regel Stapel mehr PHP-Funktionen, und dann mit einer Datenbank verbinden und im Wesentlichen nach wie vor eine MySQL-Abfrage oder etwas ähnliches ausgeführt werden.

Warum all der Abstraktion zwischen Code und Datenbank? Warum können wir nicht einfach verwenden, was wir schon wissen? Typischerweise wird ein Web-Entwickler weiß, ihre db Sprache (eine Art von SQL), und eine Art von Frontend-Sprachen wie HTML, CSS, JS, etc ...

ihre Backend-Sprache

Im Wesentlichen versuchen wir eine Abstraktionsschicht hinzuzufügen, die viele Funktionen enthält (und wir alle wissen, PHP-Funktionen können langsamer sein als eine Variable zuweisen). Ja, das ist ein Mikro Berechnung, aber immer noch, es summiert sich.

Nicht nur jetzt tun wir mehrere Funktionen zu durchlaufen haben, aber wir haben auch die Möglichkeit, die ORM Werke zu lernen, so gibt es einige Zeit dort vergeudet. Ich dachte, die ganze Idee der Trennung von Code war der Code auf allen Ebenen getrennt zu halten. Wenn Sie in der LAMP Welt sind, erstellen Sie einfach Ihre Abfrage (Sie sollten wissen, MySQL) und die bereits bestehende PHP-Funktionalität für vorbereitete Anweisungen verwenden. FERTIG!

LAMP-WEISE:

  • erstellen Abfrage (string);
  • Verwendung Mysqli vorbereitete Anweisungen und Abrufen von Daten in einem Array.

ORM-WEISE:

  • führen Sie eine Funktion, die das Unternehmen
  • bekommt
  • , die läuft eine MySQL-Abfrage
  • Starten Sie eine weitere Funktion, die ein bedingtes fügt
  • Starten Sie eine weitere Funktion, die eine andere Bedingung
  • fügt
  • eine andere Funktion ausführen, die
  • schließt sich
  • Starten Sie eine weitere Funktion, die conditionals auf der Join
  • fügt
  • eine andere Funktion ausführen, die
  • bereitet
  • läuft eine andere MySQL-Abfrage
  • Starten Sie eine weitere Funktion, die die Daten
  • holt
  • läuft eine andere MySQL Query

Hat jemand ein Problem mit dem ORM-Stack hat? Warum sind wir immer so faul Entwickler? Oder so kreativ, dass wir unseren Code sind zu schaden? Wenn es nicht kaputt ist, repariere es nicht. Im Gegenzug repariert Ihr Entwicklerteam die Grundlagen des Web-Entwicklers zu verstehen.

ORMs versuchen, ein sehr komplexes Problem zu lösen. Es gibt Grenzfälle in Hülle und Fülle und große Designkompromisse ohne klare oder offensichtliche Lösungen. Wenn Sie ein ORM-Design für Situation A zu optimieren, Sie von Natur aus es zur Lösung der Situation B umständlich machen.

Es gibt ORMs, die verzögertes Laden und Unterabfragen in einer „gut genug“ Art und Weise handhaben, aber es ist fast unmöglich, von „gut genug“, um zu „groß“.

Wenn Sie Ihre ORM entwerfen, müssen Sie auf allen möglichen umständlich Datenbank einen ziemlich guten Griff haben entwirft Ihre ORM wird Griff zu erwarten. Sie haben explizit Abwägungen machen, um welche Situationen Sie ungeschickt bereit zu handhaben sind.

Ich sehe nicht an ORMs als unflexibel oder einem anderen undichten als die durchschnittliche komplexe Abstraktion. Wie gesagt, bestimmte ORMs sind besser als andere in dieser Hinsicht.

Viel Glück das Rad neu erfinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top