Muss noch SQL geschrieben werden?


12

Gibt es bei so vielen ORM-Tools für die meisten modernen Sprachen noch einen Anwendungsfall für das Schreiben und Ausführen von SQL in einem Programm in einer Sprache / Umgebung, die diese unterstützt? Wenn ja warum?

Zur Verdeutlichung: Ich frage nicht, ob Programmierer SQL kennen müssen oder ob ich ein SQL-Tool auf meinem Desktop haben sollte. Ich frage speziell, warum ich es im Gegensatz zu einem ORM möglicherweise im Code (oder in der Konfiguration oder was auch immer) habe.


Kann ein ORM dynamische Abfragen bearbeiten? Ich weiß, dass Sie die where-Klauseln ohne große Probleme ändern können (in den meisten ORMs). Aber gibt es eine, in der Sie die gesamte SQL-Anweisung im laufenden Betrieb ändern können? Ich kenne einige Verwendungszwecke, bei denen dies ohnmächtig wäre und bei denen es wahrscheinlich einfacher wäre, mit rohem SQL umzugehen.
Tony

kurze Antwort, JA.
gabe.

Antworten:


35
  • Sie schreiben SQL bequemer, um Daten abzufragen, als Sie prozeduralen Code schreiben.
  • Ihr ORM ist zwar schön anzusehen, erzeugt jedoch in einem kritischen Bereich schrecklich langsames SQL.
  • Sie müssen die von Ihrem RDBMS bereitgestellten Funktionen nutzen, die nicht über Ihr ORM verfügbar gemacht werden können.
  • Jedes Mal SELECT * FROM..., wenn Sie tippen , tötet Gott ein Kätzchen. Und du hasst Kätzchen.
  • Sie verwenden kein ORM, OOP oder eine moderne Sprache.

8
Alles gute Gründe. Effizienz wäre jedoch meine Nummer eins. In bestimmten Situationen generiert ein ORM, wie Sie sagten, SQL, das von Hand optimiert und fein abgestimmt werden kann.
Chris

20
Wenn ich bereits weiß, was ich auf Englisch sagen möchte, warum sollte ich dann Französisch schreiben und es durch eine Blackbox leiten, die es ins Englische übersetzt? Ich würde es viel lieber selbst eloquent schreiben, als die Franzosen zu manipulieren, in der Hoffnung, dass es das richtige Englisch schafft.
Mike M.

8
die Kitty sterben !!
Quallenbaum

3
Ich spreche muttersprachlich Französisch und Englisch. Die Analogie ist sehr gut: Sie können die Hauptbotschaft tragen, aber subtile Nuancen gehen verloren. Subtile Nuancen sind manchmal wichtiger, da sie wie Körpersprache wirken, um unausgesprochene Positionen anzuzeigen. Ich schreibe lieber SQL.
Christopher Mahan

2
Abgesehen von undichten Abstraktionen scheinen die Leute hier zu vergessen, dass die meisten ORMs viele Vorteile gegenüber einfachen SQL-Abfragen haben: Cache der ersten und zweiten Ebene, verzögertes Laden (wobei eifriges Laden eine Option ist, um das N + 1-Problem zu vermeiden) und Einheitlichkeit -test die Datenzugriffsschicht (durch Umschalten des DBMS für eine In-Memory-Datenbank), um nur einige zu nennen ...
Rsenna

15

Komplexes SQL schreiben

ORM eignen sich hervorragend für grundlegende Dinge. In komplexen Situationen müssen Sie jedoch SQL schreiben.

Kurz gesagt, es besteht mit Sicherheit ein Bedarf an SQL, und dies wird auch immer so bleiben.


1
Ich habe kürzlich das Projekt eines Kollegen umgeschrieben. Ich habe 9 seiner C # -Projekte (die 2 Datenzugriffsebenen enthielten) durch ein einzelnes SQL-Skript mit 150 Zeilen ersetzt. Das Ausführen des Projekts (das Daten aus SchemaLogic in den verwalteten Metadatendienst von SharePoint 2010 importierte) dauert jetzt 3 statt 15 Minuten. Die SQL-Version ist so viel schneller und kürzer, dass sie nicht einmal im entferntesten lustig ist.
Ameise

Einhundert Prozent stimmen zu. Bei realen Geschäftsanwendungen für jede große Institution treten immer komplexe Situationen auf.
Rick Henderson

10
  • Ansichten
  • Löst aus
  • Einschränkungen
  • Pakete (SSIS, DTS usw.)
  • Immer wenn Sie den Ausführungsfluss genau steuern müssen

ORM hilft Ihnen nicht beim Erstellen, Optimieren oder Automatisieren der Datenbank. Es gibt Ihnen nur eine alternative Möglichkeit, mit der Datenbank zu interagieren, wenn Sie all diese Dinge erledigt haben.


Ich stimme zu, aber die Frage ist, ob in meinem C # -Code (zum Beispiel) SQL vorhanden sein muss, und nicht, ob DB-Arbeit erledigt werden muss. ORM würde über den meisten dieser Sachen liegen.
C. Ross

@c. ross Ja, und es ist sicherlich nicht der übliche Fall. Ich hatte Grund, all diese Dinge an bestimmten Stellen meiner Karriere durch Code zu erstellen / zu ändern / zu analysieren. Wenn Sie keinen Grund haben, diese Dinge im Code zu tun, tun Sie das nicht, aber mir ist kein ORM bekannt, das bei Schemaoperationen sehr gute Arbeit leistet. Die genaue Steuerung des Ausführungsflusses ist für die meisten Menschen ein häufigerer Fall, aber es gibt Fälle, in denen dies ebenfalls nicht erforderlich ist. Sie haben auch Recht, dass ein ORM oben liegen kann, und ich würde denken, dass dies in vielen dieser Fälle zutrifft, solange Sie das Schema nicht genug ändern, um das ORM zu verärgern.
Bill

4

Sicher:

  • Im Allgemeinen enthält ORM viel, aber am Ende sollten Sie wissen, was hinter den Kulissen passiert. Dies ist entscheidend für Leistung und Skalierbarkeit. Obwohl ich in der Anwendung nicht so viel SQL schreibe, weiß ich ungefähr, wie SQL oder DDL aussehen.
  • Direct SQL ist oft gut, um schreibgeschützte Abfragen zu schreiben. Es ist viel einfacher, es in der ORM-Abfragesprache zu formulieren, und Sie können auch die Ergebnismenge einschränken (z. B. 'ID aus ..... auswählen').
  • ORM sollte Sie überhaupt nicht von SQL fernhalten. Ich verwende SQL häufig für Ad-hoc-Abfragen direkt auf dem DB-Client (wie MySQL-Client). Es gibt Ihnen sehr schöne einheitliche Schnittstellen- und Gruppierungsfunktionen.

4

ORMs existieren aufgrund der Impedanzfehlanpassung zwischen unseren gemeinsamen relationalen DB-Implementierungen und unseren OO-Sprachfunktionen. Sie sind nur eine Brücke, aber die meisten Leute behandeln SQL wie den Limburger Käse im Kühlschrank.

Wenn Sie zu Recht sagen können, dass Sie immer Ihr ORM oder eine andere abstrahierte Datenzugriffsschicht verwenden, anstatt SQL / gespeicherte Prozeduren / Ansichten als erstklassige Schnittstelle (n) zu behandeln, sind Sie wahrscheinlich besser dran, ohne SQL zu berühren.

In der Praxis habe ich noch nie ein reines ORM-Projekt gesehen, für das nicht mindestens SQL erforderlich war, um die Datenbank zur endgültigen Validierung abzufragen.


3

ORMs sind ein Werkzeug in der Toolbox des Programmierers. Sie haben ihre eigenen Probleme. Einige Beispiele sind:

  • SQL kann nicht gesteuert werden
  • Leidet unter n + 1 Problem

2
Was ist das "N + 1-Problem"? Ich bin nicht vertraut ...
RationalGeek

Ich denke, es ist dies: stackoverflow.com/questions/97197/…
Axe

2
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Mit einem guten ORM sollten Sie bei Bedarf Raw-SQL ausführen können, und N + 1-Probleme sind im Allgemeinen Anfängerfehler (z. B. verschachtelte Schleifen über verzögert geladene Sammlungen), die leicht vermieden werden können.
Richeym

@ Richmeym: Die, wo die ersten Dinge in den Sinn kamen, die mir in den Sinn kamen. Die andere Antwort hat meinen Rücken. Der Punkt ist, dass ein ORM nur ein Werkzeug ist. Es gibt Fälle, in denen rohes SQL bevorzugt wird.
Tony

3

Wenn Sie wissen, was Sie tun, können Sie einen ORM effektiv verwenden, um einen Großteil Ihres CRUD-Typcodes zu ersetzen. Sie sind jedoch für komplexe Dinge nicht so effektiv, sie sind schwer zu optimieren (Sie wissen, dass Leistung einer der kritischen Teile des Datenbankdesigns ist und keine Objekte emuliert), und sie sind in den Händen von jemandem, der dies nicht tut, geradezu schrecklich und gefährlich SQL selbst nicht verstehen oder schreiben.

Ich möchte auch darauf hinweisen, dass komplexe Berichte mit einem ORM nicht einfach effektiv durchzuführen sind. Und wenn Sie das einfache SQL nicht in den einfachen Dingen lernen, wie werden Sie dann jemals an den Punkt gelangen, an dem Sie komplexes SQL für die Berichterstellung schreiben können? Ich habe noch nie in einer Anwendung gearbeitet, die keine Berichtsanforderungen hatte und oft recht kompliziert war.

ORMs sind auch zum größten Teil nicht für BI- oder ETL-Prozesse nützlich. Sie sind auch nicht nützlich für Datenbankadministratorabfragen oder zum Auffinden von Informationen in den Überwachungstabellen und zum Rückgängigmachen bestimmter Datenbankänderungen. Es gibt viele, viele Dinge, die mit SQL noch am effektivsten erledigt werden. Die Anwendung, die die Datenbank abfragt, ist ein kleiner Teil dessen, was in einer Unternehmensumgebung abgefragt werden muss.

Ich sehe auch viele Fragen dazu, wie man etwas mit einem ORM macht, das das Poster bereits in SQL kann. Es ist schön, neue Dinge zu lernen, aber wenn sie zusätzliche Zeit und Mühe verursachen, ohne einen wirklichen Gewinn gegenüber der ursprünglichen Methode (und oft einen echten Leistungsverlust), warum verwenden Sie sie anders als sie gerade "modisch" sind.


2

Manchmal möchte ein Client nur eine schnelle und einfache Abfrage, um Daten für einen Bericht, einen Export, einen Datenauszug usw. zurückzugeben, und möchte warten, bis ein gesamtes Programm entwickelt ist.

Außerdem kann ein guter SQL-Programmierer immer schneller und effizienter SQL schreiben als jedes von mir verwendete ORM. Außerdem habe ich festgestellt, dass viele Leute nur den ORM-Punkt auf gespeicherte Prozeduren haben - die Vorteile des ORM wirklich zu ignorieren, weil ORMs für komplexe Prozesse nicht großartig sind.

Wenn Sie eine Datenbank wie Oracle mit einer sehr umfangreichen und leistungsstarken Prozedursprache verwenden, können Sie viel tun, ohne jemals ein "Programm" zu benötigen. PL / SQL unter Oracle in den richtigen Händen ist sehr schnell und effizient.


1
PL / SLQ steht für "Procedural Language / Structured Query Language". Wie ist das also kein "Programm"?
Christopher Mahan

Christopher Mahan: Genau. Das Hauptprodukt eines Unternehmens, für das ich gearbeitet habe, besteht aus ~ 5-mal mehr PL / SQL-Code als Java Code (LOC).
user281377

0

Wenn Sie selbst eine Datenbank verwenden möchten, ja. Die meisten ORMs, die ich zu verwenden versuchte, reichten einfach nicht aus oder deckten meine Datenbank nicht ab. Außerdem, wie werden Sie Fehler beheben oder benutzerdefinierte Abfragen schreiben, die nicht behandelt werden?


0

Es wird weiterhin zum Schreiben von Triggern und gespeicherten Prozeduren benötigt. Gespeicherte Prozeduren sind derzeit möglicherweise in Ungnade gefallen, aber in einigen Situationen sind sie immer noch sehr nützlich. SQL kann auch für einige besonders haarige Joins mit mehreren Tabellen erforderlich sein.


0

Ja, Sie können das Schreiben von SQL vermeiden. Aber am Ende schreiben Sie stattdessen HQL (oder Linq oder DQL ...)!

Im Ernst, ich bin ein großer Fan von ORMs, und ich denke, man kann es vermeiden, die meiste Zeit reines SQL zu verwenden. Aber wir müssen uns daran erinnern, dass ein ORM nur eine große Abstraktion ist und alle großen Abstraktionen auslaufen ...

(Aber was das N + 1-Problem betrifft: Dies hängt mit dem verzögerten Laden zusammen, und die meisten ORM-Tools haben eine Möglichkeit, eifriges Laden anzufordern, wodurch dieses spezielle Problem vermieden wird.)


0

ORM bringt Sie nur bis zu einem gewissen Punkt. Es gibt jedoch Fälle, in denen Sie eine wirklich komplizierte Abfrage mit komplizierten Verknüpfungen, Unterabfragen, Gewerkschaften, Minus, Analysefunktionen usw. ausführen müssen. Dann benötigen Sie SQL. Aber wie sollen Sie komplizierte Abfragen schreiben, wenn Sie alle einfachen Abfragen dem ORM überlassen?


0

Selbst wenn Sie es nicht in Ihren Code schreiben mussten, ist es ziemlich praktisch, es verwenden zu können, wenn Sie Terminalzugriff auf einen Datenbankserver haben.

Außerdem hat die meisten von dem, was macht eine Herausforderung Programmierung arbeiten innerhalb der Einschränkungen , dass das Leben setzt us- oft wir sind mit altem Code arbeiten, oder alte Versionen von Datenbanken und hat nicht die Möglichkeit , die neueste ORM - Bibliothek installieren welche Sprache wir sind arbeiten mit. In dieser Situation benötigen Sie jedes Werkzeug, das Ihnen zur Verfügung steht.

In der restlichen Zeit benötigen Sie möglicherweise kein SQL für Ihre CRUD-Inhalte, aber SQL bietet viel mehr als nur einfache SELECT-, INSERT-, UPDATE- und grundlegende JOIN-Abfragen. Sie können sehr clevere Dinge damit machen, und obwohl Sie sie möglicherweise nicht oft verwenden, ist es nützlich zu wissen, was sie sind.

Ich denke, wir werden uns zunehmend in einer Post-SQL-Welt befinden. Die meisten Cloud-Dienste verwenden jedoch nicht-SQL-Tabellenspeicher, und für einfache CRUD-Arbeiten ist die volle Leistung von SQL nicht erforderlich. Das heißt aber nicht, dass es keinen Wert hat, es zu verstehen.

Natürlich muss auch jemand genug wissen, um ein besseres ORM-System zu schreiben, wenn die aktuellen nicht viel zu tun haben. Es würde ihnen helfen, wenn sie SQL kennen ...


Genau: Nachdem ich Reporting-Engines und ausgefallene Berichte aus einer Oracle Data Warehouse-Umgebung geschrieben habe, kann ich Ihnen nachdrücklich sagen, dass das Wissen über SQL nicht das gleiche ist wie das Wissen über die Verwendung eines ORM.
Christopher Mahan

0

Für die Erstellung umfangreicher Webanwendungen ist dies völlig unnötig und kann die Dinge viel stressiger und zeitaufwändiger machen, als sie sein müssen. Der Grund dafür ist, dass jede große App eine Speicherpersistenzschicht (im RAM) verwenden sollte, die häufig verwendete Speicher-Caching-Teile der Datenbank sein sollte.

Wenn Sie Dinge mit mobilen Geräten usw. tun müssen, mit denen nicht viel Arbeitsspeicher zur Verfügung steht, wird die programmierte Anwendung als "Client" oder eigenständige App auf einem mobilen Gerät, Tablet usw. ausgeführt Dinge wie die Verwendung von SQL sind immer noch üblich und wichtig, da der Speicher auf dem Gerät so klein ist, dass Sie nicht viele Dinge im Speicher zwischenspeichern können.


2
"Jede große App sollte eine Speicherpersistenzschicht (im RAM) verwenden, die häufig verwendete Teile der Datenbank zwischenspeichern soll." - Jede anständige Datenbank wird dies auch tun.
Matthew Frederick

Android und iPhoneOS verwenden beide SQLite, ein SQL-92-kompatibles Datenbanksystem. Siehe stackoverflow.com/questions/2011724/…
Christopher Mahan

0

Die Komplexität und der Umfang des von mir geschriebenen SQL reichen nicht aus, um ein ORM-Framework in angemessener Weise zu verknüpfen.

(Ich schreibe SQL vielleicht einmal im Monat, wenn)


0

Ich bin auf viele große Korps mit Datenbankadministratoren gestoßen, die Entwickler, die ORM-Tools verwenden, aktiv fürchten.

Sie sind Datenbankadministratoren, die an der Abstimmung und Leistung beteiligt sind.

Und ja, ORM-Tools können so verwaltet werden, aber ich habe Orte gesehen, an denen sie nur eine gespeicherte Prozedur (SQL Server) akzeptieren und Sie fragen, was Sie darin tun.

Außerdem können ORM-Tools stark missbraucht werden und genauso schlechtes SQL erzeugen wie das Schreiben des SQL selbst.


Ich denke, der DBA, der sich Sorgen über einen Entwickler macht, der ein ORM verwendet, ähnelt einem Entwickler, der sich Sorgen um einen Analysten / Manager / Kunden macht, der ein Tool hat, mit dem er Code schreiben kann!
Gbjbaanb

0

Ein großes Problem - DDL- und Datenbankmigrationen. Manchmal müssen Sie dieses Zeug von Hand zusammennähen, um Dinge zu aktualisieren, ohne vorhandene Daten zu beschädigen.

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.