Ich habe keine ernsthaften Erfahrungen mit SQL und ich hasse es, SQL anstelle von LINQ zu schreiben. Ich bin glücklich genug mit ORMs.
Ist es aus Sicht der Arbeitgeber und der Branche wichtig, SQL zu kennen? Muss ich das beherrschen? Sind Unternehmen, die reines SQL gegenüber ORM-Frameworks bevorzugen, ein "Dinosaurier" in der Programmierwelt?
sql
orm
entity-framework
Jemand
quelle
quelle
Antworten:
Das ist schwer zu viel Programmierer zu erklären, denn wenn man nur wissen , grundlegende SQL dann ist es wirklich nicht Sie geben viel von einem Vorteil gegenüber der Krücke eines ORM. Die fortgeschritteneren SQL-Konzepte sind jedoch ein entscheidender Teil des Unterschieds zwischen Anwendungen, die nur funktionieren, und Anwendungen, die eine hohe Qualität aufweisen (insbesondere schnell und zuverlässig).
Ich gehe davon aus, dass jemand anderes die Datenbanken für Sie entwirft , denn dies zu tun , ohne SQL zu kennen, ist einfach zu blass. Aber selbst wenn Sie sich nur gegen sie entwickeln, finden Sie hier nur eine unvollständige Liste aller Dinge, die ORMs nach wie vor schlecht oder gar nicht tun:
Die Liste geht weiter und weiter - viele dieser Dinge hat ein unerfahrener DBA noch nie zu tun gehabt, und ein unerfahrener Entwickler hat noch nie davon gehört -, aber sie sind in größeren Apps sehr wichtig.
ORMs sind wirklich großartig darin, den wirklich langweiligen SQL-Code zu beschleunigen - das heißt, all den repetitiven CRUD- und Mapping-Code und den anderen Code für die Installation. Es ist also absolut keine Schande, sie zu verwenden und niemandem zuzuhören, der sagt, dass sie böse sind. Aber Sie müssen auf jeden Fall noch lernen und ja, sogar SQL beherrschen , und bereit sein, sich in unformatierte DB-Befehle / Abfragen zu stürzen, wenn der ORM sein Gewicht nicht verliert.
quelle
GroupJoin
in LINQ) ist viel besser.GroupJoin
.GroupJoin
. Es ist nur so, dass Leute, die an SQL gewöhnt sind, in solchen Fällen sofort an Outer Join denken und sich fragen, wie man das in LINQ umsetzt. Das ist nicht der richtige Ansatz. Sie sollten nicht versuchen, SQL in LINQ zu übersetzen, sondern direkt das übersetzen, was Sie benötigen.Absolut! SQL ist immer noch die Verkehrssprache von Datenbanken, und obwohl Sie möglicherweise viel mit ORMs tun, müssen Sie SQL verstehen, um die Entscheidungen zu verstehen, die ORMs treffen, und die SQL, die sie generieren. Außerdem gibt es noch viele Dinge, die Sie auch mit benutzerdefiniertem SQL und gespeicherten Prozeduren tun müssen. Entschuldigung, kein kostenloses Mittagessen.
quelle
Ja, Sie müssen noch SQL kennen. ORMs sind eine sehr undichte Abstraktion und bieten keinen Zugriff auf die volle Leistungsfähigkeit von SQL. Für Spielzeuganwendungen sind Sie möglicherweise mit begrenzten SQL-Kenntnissen in Ordnung. Für Unternehmensanwendungen müssen Sie die Datenbank verstehen, um eine angemessene Leistung des ORM zu erzielen. Außerdem gibt es sehr viele Aufgaben, die mit SQL viel einfacher zu erledigen sind als mit einer Anwendungssprache. Ich habe Java-Programmierer gesehen, die tagelang Code geschrieben haben, um etwas zu tun, das in einer Stunde in SQL hätte codiert werden können. SQL-Kenntnisse sind sehr wertvoll für alle, die Anwendungen schreiben, die eine relationale Datenbank verwenden.
quelle
SQL-Kenntnisse sind heutzutage ein Muss in der IT. LINQ ist eine Microsoft Only-Technologie. SQL-Anwendungen gehen über die Entwicklung von Web- und Client / Server-Anwendungen hinaus. Sie können keine Datenbanken modellieren und ETL ausführen, wenn Sie nicht mit SQL vertraut sind. Möglicherweise müssen Sie keine SQL-Dialekte beherrschen, die in ORACLE und SQL Server für ihre Data Warehous-Produkte verwendet werden, aber Sie sollten Standard-SQL kennen. SQL-Grundlagen sind einfach, es gibt jede Menge Material, mit dem Sie beginnen können.
quelle
Wenn Sie mit einer SQL-Datenbank interagieren, müssen Sie die vom ORM generierte SQL verstehen. Sie müssen die Konzepte von SQL-Datenbanken verstehen und wissen, was Ihr ORM nicht für Sie tun kann. ORMs machen das Leben einfacher (und ich denke, dass Sie in vielen Fällen als Dinosaurier gelten, wenn Sie ohne sie arbeiten), aber sie sind Werkzeuge (um Dinge zu abstrahieren, die Sie kennen), keine Krücken (um Sie am Lernen zu hindern).
Wenn Sie sich weigern, SQL zu lernen, haben Sie keinerlei Probleme damit, SQL-Datenbanken mit oder ohne ORM zu berühren, und Sie sollten eine andere Art von Arbeit finden.
quelle
Ich gebe zu, dass ich ein eingefleischter ORM-Fan bin und seit Jahren die Vorteile von ORM predige und viel darüber zu sagen hatte, warum ORM SQL übertrumpft.
ABER...
Ich muss zugeben, dass SQL in der realen Welt absolut erforderlich ist und jeder Entwickler ein gutes Verständnis von SQL haben sollte.
SQL-Prozesse sind in fast allen Fällen schneller als der ORM. Auch wenn Sie die ORM-Ausgabe in den meisten Fällen optimistisch gestalten können, ist sie den SQL-Prozessen in Kürze unterlegen.
Gelegentlich benötigen Sie einige Hochleistungs-SQL-Anweisungen, um das gewünschte Ergebnis zu erzielen, und diese Monster-Abfragen lassen sich in SQL-Prozessen einfacher und schneller erstellen.
Nur meine zwei Bits.
quelle
Es wird eine Zeit kommen, in der Sie etwas Komplexes optimieren müssen, das der ORM erstellt. Zu diesem Zeitpunkt müssen Sie im Allgemeinen eine äußerst komplexe Abfrage auflösen. Wenn Sie noch nie Grundlagen gelernt haben, wie können Sie dann damit rechnen, SQL mit den fortgeschrittenen Inhalten zu erlernen? Sie werden nicht genug verstehen, um überhaupt anzufangen. ORMs in den Händen einer Person, die SQL versteht - ein gutes Werkzeug. ORMs in den Händen von jemandem, der SQL überhaupt nicht kennt - eine Katastrophe, die darauf wartet, passiert zu werden.
Einer der Gründe, warum SQL für das Verständnis von Datenbanken von entscheidender Bedeutung ist, besteht darin, dass Anwendungsprogrammierer naturgemäß nicht in Datensätzen denken. Die einzige Möglichkeit, wie Datenbanken überhaupt effizient arbeiten, sind Mengen. Sie müssen lernen, wie man in Mengen denkt, bevor Sie überhaupt versuchen, ein ORM zu verwenden.
quelle
Ich muss Abfragen in ORM-Frameworks häufig manuell erzwingen. Und während die meisten ihre eigene Abfragesprache haben, sind diese alle von SQL inspiriert, der Code wird in SQL umgewandelt, und Sie müssen verstehen, was falsch läuft, indem Sie diese SQL lesen, wenn (nicht wenn, wann) etwas schief geht oder wenn die Leistung schlecht ist.
Selbst wenn Sie SQL nicht direkt schreiben, verstehen Sie es über eine grundlegende Ebene hinaus (obwohl Sie wahrscheinlich nichts über das Schreiben gespeicherter Prozeduren, Trigger usw. lernen müssen, wenn Sie nur auf Datenbanken zugreifen möchten) sollte die Sprache so gut beherrschen, dass der generierte Code verstanden und bei Bedarf angepasst werden kann.
quelle
Bevor ich über die Frage spreche, zunächst eine kleine Einführung; Ich liebe ORMs. Und ich hasse SQL. Ich liebe ORMs, weil sie das benutzerunfreundliche Durcheinander von SQL verbergen und eine nette, sprachintegrierte Art des Umgangs mit der Datenbank bieten.
Allerdings muss ich zugeben, dass SQL viele Vorteile hat, wobei der größere die Präzision ist. Ich kann ziemlich genau über die Komplexität einer SQL-Abfrage streiten, ohne das zugrunde liegende Datenbankschema genau zu kennen, indem ich die Abfrage durcharbeite. Wenn ich SQL verwende, bin ich daher immer wachsam und habe immer ein Gespür dafür, wohin die Komplexität einer Komponente führt.
Andererseits bin ich bei der Verwendung von ORMs von der einfachen Datenbankintegration so überwältigt, dass ich buchstäblich vergesse, dass es sogar eine Datenbank gibt. Das hat mich mehrfach durcheinander gebracht. In der Vergangenheit habe ich oft unschuldig aussehende ORM-Methoden genannt, die hinter den Kulissen massive und beängstigende Datenbank-Joins aufrufen, die die Leistung zerstören.
Deshalb liegt für mich die Wahrheit irgendwo dazwischen. Ich liebe die Verwendung von ORMs und werde dies auch weiterhin tun, aber ich muss vorsichtiger sein und immer die Auswirkungen (auf SQL-Ebene) eines ORM-Methodenaufrufs untersuchen. Die Implikationen einer Abstraktionsschicht zu kennen, ist in diesem Geschäft Gold wert und rechtfertigt die Verwendung der Abstraktion. Alles andere ist, als würde man sich auf den Fuß schießen.
quelle
Wenn Sie nur mit der Datenbank interagieren müssen, obwohl Sie gerade eine Anwendung erstellen, brauchen Sie diese wahrscheinlich nicht. In einigen kleineren Unternehmen oder Entwicklerteams müssen Sie möglicherweise Unterstützung leisten. Es ist viel einfacher, eine Verbindung zur Datenbank eines Kunden herzustellen und ein paar SQL-Anweisungen auszuführen, um zu sehen, was mit seinen Daten los ist.
quelle
Selbst mit einem guten, ausgereiften ORM werden Sie unweigerlich in Situationen geraten, in denen ineffizientes SQL emittiert wird und Ihr Leben erheblich erleichtert wird, wenn Sie wissen, was in dem generierten SQL vor sich geht. Das heißt, wenn Sie mit dem ORM sehr gut vertraut sind und wissen, wie man einen Profiler für die Datenbank Ihrer Wahl verwendet, können Sie es ziemlich leicht "vortäuschen, bis Sie es schaffen".
quelle
Die Antwort auf all diese Arten von Fragen ("Muss ich X kennen?") Lautet "Lerne es, wenn du es zum ersten Mal brauchst, wenn du es jemals brauchst".
Es ist jedoch wichtig, nicht in die Falle zu gehen, Dinge weniger effizient zu erledigen, weil Sie sich nicht bewusst sind oder nicht bereit sind, zu lernen, wie man sie effizient umsetzt.
Was tun Sie beispielsweise in diesem speziellen Fall, wenn Sie feststellen, dass in Ihrem Programm ein Fehler aufgetreten ist, der dazu geführt hat, dass das
PostCount
Feld Ihrer Benutzertabelle manchmal ungenau ist?Sie beheben den Fehler und müssen nun den PostCount für alle Benutzer aktualisieren. Wie machst du das?
Wenn Sie dazu ein kleines Skript mit ORM schreiben, sind Sie sehr ineffizient. Eine sehr einfache SQL-Abfrage reicht aus.
Da diese Situationen ziemlich häufig sind, befürchte ich, dass Sie in die oben beschriebene Falle geraten sind!
quelle
Ja, Sie brauchen noch SQL.
Gehen Sie nicht davon aus, dass etwas "Altes" irgendwie unwürdig ist. Sogenannte "Legacy" -Technologien gibt es noch, nachdem sie den Test der Zeit bestanden haben. Wir nennen Wang-Computer kein "Vermächtnis", sie sind gescheitert und verschwunden.
Wenn Sie mich fragen, stört es mich, dass meine Bank wahrscheinlich COBOL auf einem Mainframe oder IBM i verwendet? Absolut nicht. Dies sind grundsolide, erprobte und echte Technologien. Ratet mal, sie verwenden hauptsächlich DB2 SQL. Ich bin viel zufriedener damit, meinem Geld dort zu vertrauen, als mit Software, die in einer modischen Sprache des Monats entwickelt wurde.
Die Dinosaurier lebten auf dieser Erde viel länger als wir Menschen. Und wenn Sie Jurasic Park lesen (ja, Bücher sind besser als Filme), dann frage ich Sie, möchten Sie sich wirklich mit einer Packung überaus cleverer Velociraptoren oder einem verbissenen T-Rex auseinandersetzen, der niemals aufgibt? Lassen Sie sich nicht von der Unterschätzung der "Dinosaurier" beißen. ;-)
quelle
Abgesehen von Spielen und (hauptsächlich statistischen) Nachforschungen, mit denen ich keine Erfahrung habe, scheinen Datenbankzugriffe und -operationen einer der wenigen Bereiche zu sein, in denen falsche Entscheidungen zu sehr großen Leistungseinbußen führen. Ich glaube fest an leistungsfähigere Datenbankabstraktionen im Code und an linq, das die Datenbankoperationen mit der Programmiersprache verknüpft und Ihnen alle Tools der Sprache zur Verfügung stellt (Typprüfung, Syntaxprüfung, all die Dinge, die Sie mögen Ihre Programmiersprache), während Sie immer noch viel Macht haben, um das zu tun, was Sie wollen, ist absolut grandios. Leider funktioniert es immer noch nicht. Das heißt, wenn die Abstraktionsschicht falsch optimiert ist und Sie möglicherweise auf Sekunden anstatt auf Mikrosekunden oder Minuten anstelle von Sekunden auf Ihr Ergebnis warten. Da dies sehr auffällige Zeiten sind, Sie müssen sie wegoptimieren, oder Ihre Anwendung "funktioniert" nicht: Die Leistung wird zum größten Problem Ihrer Anwendung. Das heißt, Sie müssen näher an das Metall heranrücken und von Hand optimieren.
Wenn wir an dem Punkt angelangt sind, an dem das Manipulieren großer Datenmengen beispielsweise 3 ms von Hand dauert und 100 ms, wenn Sie die Abstraktionsschicht dies für Sie tun lassen, lassen Sie es auf jeden Fall die Abstraktionsschicht für Sie erledigen, weil Sie dies könnten 30-mal langsamer sein, aber Sie sind trotzdem (wahrscheinlich für die meisten Anwendungen) schnell genug. Die Realität sieht jedoch so aus, dass Sie, wenn Sie nach handoptimierten Lösungen suchen, bei denen Sie eine Reaktionszeit von 200 ms haben, und wenn die Abstraktionsschicht dies für Sie erledigt, der Algorithmus "nur" einen 10-fachen Leistungstreffer hat 2 Sekunden Verspätung, und dann kümmert es dich eine ganze Menge, da es von nicht ganz so schnell bis schmerzhaft langsam geht. Zu sehen, dass relationale Datenbanklösungen nicht gut skalierbar sindIch glaube nicht, dass dies in zwei oder drei Jahren gelöst sein wird. Dies bedeutet, dass Sie sich bei größeren Datenbanken noch eine Weile mit dem Nötigsten befassen müssen, oder Ihre Anwendung wird so langsam sein, dass sie den Wettbewerbern nicht standhalten kann.
quelle