Ist es nicht notwendig, die Art von Datenstrukturen und Objekten in SQL nur zu lernen, weil wir eine andere Sprache verwenden, um indirekt auf db zuzugreifen?

8

Angenommen, wir verwenden Java oder Python, um auf die Datenbank zuzugreifen. Wird es dann als Zeitverschwendung und unnötig angesehen, die Art der Datenstrukturen und Objekte zu lernen, die in SQL verwendet werden?

Bitte antworten Sie in Bezug auf die Softwareindustrie. Bitte versuchen Sie zu sagen, in welchen Fällen es gut ist, über solche Dinge Bescheid zu wissen.

Ich habe einen Streit mit jemandem, der sagt, dass es unnötig ist, solche Dinge zu lernen.

aste123
quelle
11
Wer auch immer Sie streiten, muss die Unvermeidlichkeit von undichten Abstraktionen lernen.
Alternatex
5
@Alternatex - hätte wahrscheinlich die Quelle dieser Weisheit verknüpfen sollen .
Jules
Wenn Sie nur wissen, wie man einen Hammer benutzt, behandeln Sie jedes Problem so, als wäre es ein Nagel ...
gbjbaanb

Antworten:

20

Vor einigen Jahren habe ich an einer Anwendung gearbeitet, die von jemandem geschrieben wurde, der offensichtlich nie gelernt hatte, wie SQL-Datenbanken funktionieren. Ich erhielt einen Problembericht, den ich beheben musste. Die Seite mit der Hauptstatusübersicht, die immer langsam war, war jetzt so langsam, dass beim Rendern das Zeitlimit für die Ausführung des Serverskripts (von 3 Minuten) überschritten wurde. Es schien, dass mit zunehmender Anzahl von Clients im System die Zeit zum Rendern der Statusseite quadratisch zunahm .

Es dauerte nicht lange, bis ich das Problem bemerkte. Die Seite verwendete eine Abfrage, bei der Daten aus zwei verschiedenen Tabellen zusammengeführt wurden, von denen keine Indizes hatte . Da jede Tabelle eine Größe hatte, die mit der Anzahl der Clients in O (n) zunahm, dauerte die Ausführung der Abfrage O (n ^ 2), da jede Zeile der ersten Tabelle und für jede dieser Zeilen abgerufen wurde holte jede Zeile der zweiten Tabelle, um sie zu vergleichen.

Die Lösung des Problems dauerte Minuten, und jeder, der versteht, wie SQL-Datenbanken funktionieren, hätte dies genauso schnell tun können . Der ursprüngliche Autor tat dies nicht und hinterließ eine völlig unzureichende Lösung.

Sie müssen verstehen, wie (zumindest allgemein) eine Technologie funktioniert, um schreckliche Fehler wie diesen zu vermeiden.

Jules
quelle
Wie wäre es mit der Art von Objekt, das SQL für eine bestimmte Abfrage zurückgibt? Ist es notwendig, solche Details zu kennen? Das vor mir vorgebrachte Argument ist, dass wir nicht wissen müssen, welche Art von Objekt das Bare-Bone-SQL zurückgegeben hat, da die Sprache, die die Datenbank wie Java abfragt, das SQL-Objekt in eine andere Form konvertiert, bevor es an den aufrufenden Code zurückgegeben wird.
Aste123
2
@ aste123 Es ist wichtig, die Unterschiede zwischen den von der Datenbank verwendeten Datentypen und Ihrer Hostsprache zu verstehen , da diese zu Schwierigkeiten bei der Konvertierung führen können. Betrachten Sie zum Beispiel Daten. Viele Datenbanken haben einen viel kleineren Datumsbereich, den sie speichern können als Java (SQL Server lehnt beispielsweise jedes Datum vor dem Jahr 1753 und MySQL vor 1001 ab, während beide Daten nach 9999 ablehnen).
Jules
5

Schließen Sie nicht die Möglichkeit aus, dass Sie tatsächlich in die Datenbank gehen und diese im Rahmen eines Debugging-Prozesses direkt abfragen müssen. Wenn Sie dies jemals tun, möchten Sie auf jeden Fall alles über die Datenbanktechnologie und die Struktur Ihrer speziellen Datenbank wissen. Vielleicht passiert es nicht. Aber wenn es so ist (und meiner Erfahrung nach immer irgendwann), brauchen Sie dieses Wissen.

Nehmen wir jedoch an, dass Sie aus irgendeinem Grund niemals direkt in die Datenbank schauen müssen. Nehmen wir an, Sie verwenden das ORM in einer Weise, die mit allen von der Community festgelegten Best Practices übereinstimmt. Sie können eine performante App ohne größere Fehler / Engpässe / Ineffizienzen in Bezug auf die Daten erstellen. Aber wenn Sie die zugrunde liegende Datenbank nicht wirklich verstehen, werden Sie nicht wirklich verstehen, warum Sie die Dinge so machen, wie Sie sind. Schlimmer noch, du würdest nicht wirklichVerstehen Sie, wie die Best Practices für Ihren spezifischen Anwendungsfall gelten. Diese Tatsachen sollten Zweifel daran aufkommen lassen, dass Sie die optimale Lösung schaffen. Ihre Lösung mag funktionieren, aber Sie können nicht mit echtem Vertrauen sagen, dass dies die beste Lösung ist. Wenn Sie das nicht sagen können, sind Sie in den Augen Ihres Unternehmens kein großer Gewinn, und wenn Sie das sagen und sich irren, wird das für Sie schrecklich aussehen.

Abgesehen von den philosophischen Problemen, die ich habe, wenn ich die Grundlagen Ihres Tech-Stacks nicht lerne, beschäftige ich mich mit konkreten Gründen, um Ihren Stack täglich von oben nach unten zu kennen. In meiner Firma haben wir einen riesigen Monolithen, der enorme Datenmengen verarbeitet. Die Dinge sind gut modelliert, aber es gibt Dutzende von Objekttypen in der Anwendung, und die Beziehungen zwischen ihnen sind ein erstaunliches Netz von Fremdschlüsseln und Zuordnungstabellen. Ehrlich gesagt, wenn Sie nie in SQL schauen und einfach in die App eintauchen (obwohl alles in der App korrekt modelliert ist und das ORM und die bewährten Methoden für dieses ORM verwendet), finden Sie heraus, wie Sie diese Informationen mit diesem anderen Bit erhalten können hier kann eine fast unmögliche Aufgabe sein. Wenn Sie jedoch in die Datenbank eintauchen können, können Sie alle Felder in jedem Modell sehen. Folgen Sie den Verbindungen zwischen den Tabellen. Finden Sie einen Pfad von einem Teil zum anderen heraus, testen Sie ihn mit einer Abfrage und suchen Sie dann die richtigen Modelle, um ihn schnell und effizient durch das ORM zu führen. Ich wäre nicht das halbe Kapital für mein Unternehmen, das ich bin, wenn ich nicht ein hohes Maß an Komfort mit Bare-Metal-SQL hätte.

Jon Swanson
quelle
5

Nur bis zu einem gewissen Punkt

Als Softwareentwickler müssen Sie wahrscheinlich die Datenbank abfragen und aktualisieren. Die Kenntnis der Funktionsweise der Datenbank ist entscheidend, um fehlerhafte Abfragen, ineffiziente Verknüpfungen usw. zu vermeiden. Sie könnten einen dedizierten DBA haben , die entscheiden können , wo Indizes ir Partition der Datenbank hinzugefügt werden , aber Sie können nicht darauf zählen, nicht in kleinen Unternehmen und nicht immer in Großen auch nicht .

jedoch

Während Sie wissen sollten, was Indizes sind und wie sie verwendet werden sollten, müssen Sie wahrscheinlich nicht wissen, wie sie intern funktionieren. Die internen Implementierungsdetails sind genau das - Implementierungsdetails.

Wenn Sie wissen, wie Sie einen SQL-Abfrageplan überprüfen und Ihren Code entsprechend erstellen, ist dies Teil der API, die Ihre Datenbank verfügbar macht. Kennen Sie die internen Algorithmen und Datenstrukturen, mit denen dies erreicht wird? Nicht. So viel. Als Analogie sollte ich die Auswirkungen des Speicherns von Dateien auf die Festplatte auf die Leistung kennen. Ich muss mich nicht darum kümmern, wie mein Dateisystem implementiert ist.

Allerdings zum

Wenn es, wie klarstellende Kommentare zeigen, um das Verständnis des DB-Zugriffs geht und nicht nur um ORMs und andere Code-Abstraktionen, lautet die Antwort überwiegend "Ja, Sie sollten den DB-Zugriff kennen". Nicht jedes Projekt verwendet oder kann ein ORM verwenden, und ORMs sind für bestimmte Aufgaben (Berichte, Masseneinfügungen usw.) nicht ideal.

Avner Shahar-Kashtan
quelle
Wie wäre es mit der Art von Objekt, das SQL für eine bestimmte Abfrage zurückgibt? Ist es notwendig, solche Details zu kennen? Das vor mir vorgebrachte Argument ist, dass wir nicht wissen müssen, welche Art von Objekt das Bare-Bone-SQL zurückgegeben hat, da die Sprache, die die Datenbank wie Java abfragt, das SQL-Objekt in eine andere Form konvertiert, bevor es an den aufrufenden Code zurückgegeben wird.
Aste123
@ aste123 Hier ist ein Beispiel, warum Sie sich interessieren: Welchen Datumsbereich können Sie in eine SQL-Datetime-Spalte einfügen? Welchen Datumsbereich können Sie in eine Java-Datetime-Variable einfügen, die aus der Datenbank gelesen wird? Wenn die beiden nicht genau gleich sind, können Probleme auftreten, von denen Sie keine Ahnung haben, ob sie behoben werden sollen. Aber sicher, der durchschnittliche Programmierer muss sich nicht darum kümmern, aber der großartige Programmierer tut es immer ..
gbjbaanb
@ Jules gut ich nie! ... trotzdem, große Köpfe ... haben wahrscheinlich die gleichen verdammten datetime-bezogenen Belästigungen :-)
gbjbaanb
3

Es ist absolut die Zeit wert! Als Full-Stack-Entwickler können Sie effizient Mehrwertlösungen erstellen. Ich habe allzu oft Kommunikationsstörungen und Silo-Entwicklung gesehen ... Verdreifachen Sie die Entwicklungszeit und die Hälfte der Qualität.

Letztendlich werden Sie umso wertvoller sein, je mehr Fähigkeiten Sie haben.

John Cappelletti
quelle
3

Wenn Sie behaupten, nichts über Autos zu wissen , würde ich mich freuen, wenn Sie die Bremsen an meinen warten ? Ich denke nicht.

Datenbanken unterscheiden sich deutlich von den Datenstrukturen, mit denen Sie beim Programmieren gewohnt sind. Sie haben ihre eigenen Kuriositäten und Eigenheiten und andere Dinge, die Sie in der Anwendungsleistung beißen, wenn Sie sie nicht verstehen.

Ich habe Leute mit dieser Mentalität "Ich muss keine Datenbanken kennen" getroffen. Die meisten von ihnen betrachten Datenbanken als nichts anderes als Tabellenkalkulationen und produzieren Anwendungen, die infolgedessen eine erschreckend schlechte Leistung erbringen.

Sie müssen jedoch nicht wissen, wie Datenbanken intern funktionieren .

Lernen Sie das logische Zeug kennen; Tabellen, Indizes, Ansichten und dergleichen.

Lassen Sie sich nicht von den Implementierungsdetails einfangen, wie ein bestimmtes DBMS mit diesen Dingen umgeht. Sie alle machen es unterschiedlich (und manchmal zwischen Versionen von sich selbst !), so dass eine allgemeine "Übersicht" Ihnen am besten dient.

Phill W.
quelle
2

Sie müssen es unbedingt wissen. Wenn in Ihrer Datenbank beispielsweise Daten gespeichert sind, müssen Sie wissen, welche Genauigkeit Sie erwarten können. Wenn Sie einen Zeitstempel in einem DATEFeld speichern , sollten Sie wissen, ob die Datenbank Ihren Wert auf die nächste Sekunde (oder schlimmer noch auf den nächsten Tag) kürzen wird. Sie sollten auch wissen, dass Werte, die aus einer NUMBER(9,2)Spalte stammen, in einer Gleitkommavariablen gespeichert werden müssen, während die Werte in a NUMBER(15,0)als Ganzzahlen gespeichert werden können. Es kann auch nützlich sein, kleine Kuriositäten zu kennen, wie beispielsweise, dass die CHARSpalten von Oracle auf die angegebene Länge leer aufgefüllt werden, während dies bei VARCHAR2Spalten nicht der Fall ist. Und ihr LONGDatentyp speichert tatsächlich Zeichenfolgen variabler Länge, keine Zahlen.

Jede Datenbank hat ihre Macken, und Sie sollten wissen, was sie sind (oder zumindest, wonach Sie suchen müssen).

TMN
quelle
1

Wenn Sie wissen, wie die Dinge unter der Haube funktionieren, können Sie Ihre Abfragen unter Berücksichtigung von Leistung und Speicher debuggen.

Beispielsweise ist eine Bereichsabfrage mit einem Index vom Typ B-Tree besser. Und wenn Sie Joins ausführen, können Sie der Abfrage-Engine Hinweise hinzufügen, ob HASH- oder MERGE-Joins verwendet werden sollen. Auf der physischen Seite können Sie Tabellen in einer Datenbank auf verschiedene physische Festplattenpartitionen verteilen, um Kopfkonflikte zu minimieren (wahrscheinlich auch bei SSDs noch geeignet).

Bon Ami
quelle
0

Zuerst müssen Sie sich darüber im Klaren sein, was SQL ist und was nicht. SQL ist eine Abfragesprache und Datenmanipulationssprache, die für den Zugriff auf und die Bearbeitung von Daten in einer relationalen Datenbank verwendet wird. Das Schema und die Datenobjekte (Tabellen, Spalten, Indizes, Einschränkungen) in der Datenbank sind jedoch nicht "in SQL". SQL ist nur eine mögliche Sprache zum Abfragen und Bearbeiten der Daten.

Um effektiv mit einer relationalen Datenbank arbeiten zu können, müssen Sie Tabellen, Spalten, Datentypen, Primärschlüssel, Fremdschlüssel und Indizes verstehen. Sie müssen auch die Grundlagen der Abfrage verstehen: Projektion, Filter, Verknüpfungen. Sie müssen die Grundlagen der Normalisierung verstehen.

Für keines dieser Dinge müssen Sie jedoch im Prinzip SQL berühren. Möglicherweise können Sie das Datenbankschema in einem GUI-Designer entwerfen und Abfragen und Aktualisierungen in einer anderen Sprache wie SqlAlchemy für Python oder Linq für .net schreiben. Einige argumentieren sogar, dass diese Sprachen eine reinere Darstellung des relationalen Modells sind als SQL.

Theoretisch hat Ihr Freund also Recht - Sie müssen SQL nicht lernen. Sie müssen jedoch noch lernen, wie relationale Datenbanken funktionieren, und wenn Sie das wissen, ist SQL ziemlich einfach zu erlernen, da es sich nur um eine Syntax handelt.

Obwohl dies nicht erforderlich ist, ist es sehr praktisch, SQL zu kennen, da Sie jede Datenbank direkt in SQL abfragen können, ohne dass eine separate Übersetzungsschicht erforderlich ist. Und da alle Tutorials, Bücher und Beispiele SQL verwenden, wird es schwierig sein, das Erlernen zu vermeiden.

JacquesB
quelle
-1

Ich stieß auf ein Problem, bei dem Seriennummern als 10-stellige Dezimalzahlen in einer Datenbank gespeichert und in Java in 32-Bit-Ganzzahlen eingelesen wurden. Dies war in Ordnung, bis wir unsere erste Seriennummer erreichten, die größer als 2G war, sodass sie nicht in Javas 32-Bit-Ganzzahl mit Vorzeichen dargestellt werden konnte. Das Verständnis der DB-Datentypen hat dieses Problem möglicherweise verhindert.

Topher Eliot
quelle