2009-07-05 9 views
7

Ich habe jemals mehrere Projekte basierend auf Python-Framework Django entwickelt. Und es hat meine Produktion stark verbessert. Aber als das Projekt veröffentlicht wurde und es mehr und mehr Besucher gibt, wird der db zum Engpass der Performance.Was bedeutet ORM?

Ich versuche, das Problem anzugehen, und finde, dass es ORM (Django) ist, damit es so langsam wird. Warum? Weil Django eine einheitliche Schnittstelle für den Programmierer bereitstellen muss, egal welches db-Backend Sie verwenden. Es opfert also definitiv die Leistung einiger db (machen Sie eine rohe SQL zu mehreren SQL und verwenden Sie nie die db-spezifische Operation).

ich die ORM mich frage, ist auf jeden Fall sinnvoll und es kann:

  1. Angebot eine einheitliche OO-Schnittstelle für die progarammers
  2. Machen Sie das db-Backend Migration viel einfacher (von MySQL zu SQL Server oder andere)
  3. die robuste des Codes verbessern (unter Verwendung bedeutet ORM weniger Code und weniger Code bedeutet weniger Fehler)

Aber wenn ich nicht die Anforderung der Migration haben Was ist der Sinn der ORM für mich?

ps. Kürzlich erzählte mir mein Freund, dass das, was er gerade macht, nur den ORM-Code in den rohen SQL-Code umwandelt, um eine bessere Leistung zu erzielen. was für eine Schande!

Also was ist die wahre Bedeutung von ORM außer dem, was ich oben erwähnt habe? (Bitte korrigieren Sie mich, wenn ich einen Fehler gemacht habe. Danke.)

+5

Eher als "Bedeutung" Ich denke, du meinst "Wert"? –

+0

Sie haben Recht. Vielen Dank. –

Antwort

7

Sie haben Ihre eigene Frage meistens beantwortet, als Sie die Vorteile eines ORM aufgelistet haben. Es gibt definitiv einige Optimierungsprobleme, denen Sie begegnen werden, aber die Abstraktion der Datenbankschnittstelle wird diese Nachteile wahrscheinlich übersteuern.

Sie erwähnen, dass das ORM manchmal viele SQL-Anweisungen verwendet, wo es nur eines verwenden könnte. Vielleicht möchten Sie sich das "eifrige Laden" anschauen, wenn dies von Ihrem ORM unterstützt wird. Dies weist das ORM an, die Daten von verwandten Modellen gleichzeitig mit dem Abrufen von Daten von einem anderen Modell abzurufen. Dies sollte zu mehr performanter SQL führen.

Ich würde vorschlagen, dass Sie mit Ihrem ORM bleiben und die Teile optimieren, die es brauchen, aber, erforschen Sie alle Methoden innerhalb des ORM, die Ihnen erlauben, die Leistung zu erhöhen, bevor Sie SQL schreiben, um den Zugriff zu machen. eine Programmiertechnik, um Daten zwischen inkompatiblen Systemen des Typs in relationalen Datenbanken Umwandlung und objektorientierte Programmiersprachen

+0

Ich stimme meistens mit Ihnen überein. Tatsächlich kann ich herausfinden, welche ORM-Operationen die DB-Abfrage verlangsamen und sie nach dem Hacken des internen ORM optimieren. Es bedeutet, dass ich auf der einen Seite sehr gut sql wissen sollte und auf einer anderen Seite den ORM sehr gut kenne. Es scheint unwürdig, verglichen mit der Fokussierung auf den rohen SQL. –

3

Ein gutes ORM ermöglicht es Ihnen, den Datenzugriff zu optimieren, wenn Sie feststellen, dass bestimmte Abfragen einen Engpass darstellen.

Aber die Tatsache, dass Sie dies tun müssen, entfernt in keiner Weise den Wert des ORM-Ansatzes, weil es Sie schnell an den Punkt bringt, wo Sie herausfinden können, wo die Engpässe sind. Es ist selten der Fall, dass jede Codezeile dieselbe sorgfältige Handoptimierung benötigt. Das meiste wird nicht. Nur wenige Hotspots erfordern Aufmerksamkeit.

Wenn Sie das ganze SQL von Hand schreiben, sind Sie "Mikro-Optimierung" über das gesamte Produkt, einschließlich der Teile, die es nicht brauchen. Sie verschwenden also meistens Mühe.

+0

Was ist, wenn Entwickler-DBAs die Daten mit mehreren verschiedenen Clientteams verwalten, die auf die Datenbank zugreifen? – gbn

+0

@gbn - nicht sicher, wo Sie mit dieser Frage gehen, aber in diesem Fall würde ich eine einzige Datenschicht (mit einem ORM entwickelt) zu allen anderen Teams zu teilen, und dann als Antwort auf ihre erweitern Feedback (ob auf Leistung, Benutzerfreundlichkeit oder anderen Qualitätskriterien). –

+0

Meine Richtung ist: Alle meine Client-Teams Code gegen meine gespeicherten Prozeduren. Dadurch kann ich mit Java, C#, vb.net und VBA Clients umgehen. Die DAL ist gespeicherte Prozeduren. Die Client-Sprache und ORM ist irrelevant. – gbn

1

Hier ist die Definition von Wikipedia

objekt-relationalen Mapping wird.Dies erzeugt in Wirklichkeit eine "virtuelle Objektdatenbank", die innerhalb der Programmiersprache verwendet werden kann.

0

ein gutes ORM (wie Djangos) macht es viel schneller, Ihre Anwendung zu entwickeln und zu entwickeln; Sie können davon ausgehen, dass Sie alle relevanten Daten zur Verfügung haben, ohne dass Sie jede Verwendung in Ihren handgesteuerten Abfragen berücksichtigen müssen.

aber eine einfache (wie Django) entlastet Sie nicht von gutem alten DB-Design. Wenn Sie DB-Engpass mit weniger als mehreren hundert gleichzeitige Benutzer sehen, haben Sie ernsthafte Probleme. Entweder ist Ihre DB nicht gut abgestimmt (normalerweise fehlen Ihnen einige Indizes) oder sie stellt das Datendesign nicht angemessen dar (wenn Sie für jede Seite viele verschiedene Abfragen benötigen, ist dies Ihr Problem).

Also, ich würde nicht die ORM Graben, es sei denn, Sie sind Twitter oder flickr. Führen Sie zunächst alle üblichen DB-Analysen durch: Sie sehen viele Full-Table-Scans? Fügen Sie entsprechende Indizes hinzu. Viele Anfragen pro Seite? Überdenken Sie Ihre Tische. Jeder Benutzer benötigt viele Statistiken? sie im Batch-Job vorberechnen und von dort aus bedienen.

+0

Danke. Aber nachdem Sie die DB abgestimmt haben, und Sie können das gleiche Problem haben. Vielleicht kann die DB nicht mehr gestimmt werden, und Sie müssen überlegen, die ORM-Operationen in row sql umzuschreiben, um eine bessere Leistung zu erzielen. –

+0

natürlich. Ich glaube nur, dass die Leistungsgrenze des ORM wirklich hoch ist. Die meisten Websites werden nicht in der Nähe sein. Es ist auch nicht nur 'tuning the DB'; Es geht auch darum, die richtige Datenstruktur und Algorithmen zu verwenden. Wenn Sie 50 Abfragen pro Seite ausführen, hilft Ihnen kein DB-Tuning. Sie müssen es auf weniger als 10, im Idealfall auf weniger als 5 reduzieren. – Javier

0

ORM trennt Sie davon, das lästige SQL zu schreiben.

Es ist auch hilfreich, wenn Sie (nie) Ihre Software auf eine andere Datenbank-Engine portieren.

Auf der Kehrseite: Sie verlieren Leistung, die Sie reparieren, indem Sie eine benutzerdefinierte Variante von SQL schreiben - die es zu isolieren versuchte, an erster Stelle zu schreiben.

+0

Danke. Aber ich nehme an, du hast meine Post nicht gelesen. –

+0

Nein, ich habe es gelesen. Sie haben die zwei Gründe für ORM. –

0

ORM generiert SQL-Abfragen für Sie und wird dann als Objekt an Sie zurückgegeben. Deshalb ist es langsamer als wenn Sie direkt auf die Datenbank zugreifen. Aber ich denke, es ist ein bisschen langsam ... Ich empfehle Ihnen, Ihre Datenbank zu optimieren. Möglicherweise müssen Sie über Index der Tabelle usw. überprüfen.

Oracle zum Beispiel, müssen abgestimmt werden, wenn Sie schneller (ich weiß nicht, warum, aber meine db-Admin haben das und es arbeitet schneller mit Abfragen das mit vielen Daten verbunden ist).

Ich habe Empfehlung, wenn Sie komplexe Abfrage (zB: Berichte) anders als (Create Update Delete/CRUD) und wenn Ihre Anwendung wird keine andere Datenbank verwenden, sollten Sie direkte sql verwenden (ich denke, Django hat es Feature)

+0

Danke. Und deine Schlussfolgerung ist fast dieselbe mit meiner. –