Advertisement
  1. Code
  2. Web Development

10 Wichtige SQL-Tipps für Entwickler

Scroll to top
Read Time: 14 min

German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)

SQL ist eine weitere wichtige Sprache für Entwickler, die datengesteuerte Websites erstellen möchten. Viele Entwickler sind jedoch mit verschiedenen Aspekten von SQL nicht vertraut. In diesem Artikel werden zehn wichtige Tipps analysiert.

1. Verwenden Sie die richtige Sprache

Webentwickler verfügen häufig über eine Vielzahl von Sprachen. Für Entwickler ist es wichtig, die richtige Sprache für den Job zu verwenden.

Lassen Sie uns den folgenden Code überprüfen. Im ersten Beispiel wählt der Entwickler alle Spalten und alle Zeilen aus der Kundentabelle aus. Im zweiten Beispiel wählt der Entwickler nur den Vornamen, den Nachnamen und die Adresse aus der Kundentabelle für einen einzelnen Kunden mit der ID 1001 aus. Die zweite Abfrage schränkt nicht nur die zurückgegebenen Spalten ein, sondern bietet auch eine bessere Leistung.

Stellen Sie beim Schreiben von Code sicher, dass dieser effizient funktioniert.

Zu viele Entwickler sind mit Code zufrieden, der für 100 Datenzeilen eine angemessene Leistung erbringt, wobei wenig darüber nachgedacht wird, wann die Datenbank 10.000 Zeilen enthalten wird.

2. Sichern Sie Ihren Code

Datenbanken speichern wertvolle Informationen. Aufgrund dieser Tatsache sind Datenbanken häufig Hauptziele für Angriffe. Vielen Entwicklern ist nicht bewusst, dass ihr Code kritische Sicherheitslücken aufweist. Dies ist nicht nur für Kunden, sondern auch für Sie eine sehr beängstigende Tatsache. Derzeit können Entwickler rechtlich zur Rechenschaft gezogen werden, wenn ihre persönliche Fahrlässigkeit zu einem Datenbanksicherheitsrisiko führt, das dann ausgenutzt wird.

Falls Sie nicht von der Ernsthaftigkeit der Datenbanksicherheit überzeugt sind, sollten diese beiden Artikel helfen, den Punkt nach Hause zu bringen:

"Das FBI und die Staatspolizei von Virginia suchen nach Hackern, die vom Staat verlangt haben, ihnen bis Donnerstag ein Lösegeld in Höhe von 10 Millionen Dollar für die Rückgabe von Millionen von persönlichen pharmazeutischen Unterlagen zu zahlen, die sie angeblich aus der Datenbank für verschreibungspflichtige Medikamente des Staates gestohlen haben."
Lesen Sie den Artikel der Washington Post

"Kaspersky Lab, ein in Moskau ansässiges Sicherheitsunternehmen, gab heute zu, dass eine Datenbank mit Kundeninformationen seit fast elf Tagen verfügbar ist und dass es erst von dem Verstoß erfahren hat, als rumänische Hacker der Firma am vergangenen Samstag davon erzählten."
Lesen Sie den ComputerWorld-Artikel

Sehen wir uns ein weiteres Beispiel mit Pseudocode an.

Hoffentlich haben Sie sich diesen Code oben angesehen und die Sicherheitsanfälligkeit bemerkt. Die Abfrage wählt schließlich alle Benutzernamen- und Kennwortdatensätze aus der Tabelle aus, da 1 immer gleich 1 ist. In diesem Beispiel wird für den potenziellen Hacker nicht viel erreicht. Es gibt jedoch nahezu unbegrenzte Möglichkeiten für zusätzlichen Schadcode, der mit katastrophalen Ergebnissen hinzugefügt werden kann.

Wie können Sie sicheren Code schreiben?

Die Lösung ist häufig DBMS-spezifisch. Das heißt, es variiert zwischen MySQL, Oracle oder SQL Server. In PHP mit MySQL ist es beispielsweise üblich, Parameter mit der Funktion mysql_real_escape_string zu maskieren, bevor die SQL-Abfrage gesendet wird. Alternativ können Sie vorbereitete Anweisungen verwenden, um Ihre Abfragen "vorzubereiten". Machen Sie es sich zur Aufgabe, das DBMS, mit dem Sie arbeiten, und die damit verbundenen Sicherheitsprobleme zu verstehen.

SQL Injection ist nicht die einzige Sicherheitslücke, über die sich Datenbanken und Entwickler Sorgen machen müssen. Es ist jedoch eine der häufigsten Angriffsmethoden. Es ist wichtig, dass Sie Ihren Code testen und mit den neuesten Sicherheitsproblemen für Ihr DBMS vertraut sind, um sich vor Angriffen zu schützen.

3. Joins verstehen

SQL-Select-Anweisungen für einzelne Tabellen sind recht einfach zu schreiben. Geschäftsanforderungen schreiben jedoch häufig vor, dass komplexere Abfragen geschrieben werden müssen. Beispiel: "Finden Sie alle Bestellungen für jeden Kunden und zeigen Sie die Produkte für jede Bestellung an". In dieser speziellen Situation ist es wahrscheinlich, dass es eine Kundentabelle, eine Auftragstabelle und eine order_line-Tabelle gibt (die letzte besteht darin, eine mögliche Viele-zu-Viele-Datensatzbeziehung aufzulösen). Für diejenigen, die mit SQL etwas besser vertraut sind, ist es offensichtlich, dass für diese Abfrage tatsächlich zwei Tabellenverknüpfungen erforderlich sind. Schauen wir uns einen Beispielcode an.

Okay, einfach genug. Für diejenigen, die es nicht wissen, ist der obige Code eine innere Verknüpfung. Insbesondere ist der obige Code ein Equi-Join.
Definieren wir die verschiedenen Arten von Verknüpfungen.

Innere Verknüpfungen: Der Hauptzweck von inneren Verknüpfungen besteht darin, übereinstimmende Datensätze zurückzugeben.

Äußere Verknüpfungen: Für äußere Verknüpfungen muss nicht für jeden Datensatz ein übereinstimmender Datensatz vorhanden sein.

  • Linke äußere Verknüpfung: Eine linke äußere Verknüpfung der Tabellen A und B gibt alle übereinstimmenden Datensätze von A und B sowie alle nicht übereinstimmenden Datensätze aus der linken Tabelle zurück, in diesem Fall A.
  • Rechter äußerer Join: Ein rechter äußerer Join der Tabellen A und B gibt alle übereinstimmenden Datensätze von A und B sowie alle nicht übereinstimmenden Datensätze aus der rechten Tabelle zurück, in diesem Fall B.
  • Vollständige äußere Verknüpfung: Eine vollständige äußere Verknüpfung der Tabellen A und B gibt alle übereinstimmenden Datensätze von A und B sowie alle nicht übereinstimmenden Datensätze aus beien Tabellen zurück.

Besonderer Dank geht an Ronald Erdei für die Bilder.

Selbst verbindet

Es gibt einen letzten Join-Typ, der berücksichtigt werden muss, nämlich einen Self-Join. Ein Self-Join ist lediglich ein Join von einer Tabelle zu sich selbst.

In dieser Situation wäre ein Self-Join erforderlich, um herauszufinden, welche Mitarbeiter von einem bestimmten Mitarbeiter beaufsichtigt werden.

Hoffentlich werden dadurch die Grundprinzipien von Joins geklärt, da sie eines der Hauptmerkmale von SQL sind, das es zu einer so leistungsstarken Datenbanksprache macht. Stellen Sie sicher, dass Sie die richtige Verknüpfung für Ihre gegebene Situation verwenden.

4. Kennen Sie Ihre Datentypen

In SQL ist normalerweise jeder Tabellenspalte ein Datentyp zugeordnet. Text, Ganzzahl, VarChar, Datum und mehr sind normalerweise verfügbare Typen, aus denen Entwickler auswählen können.

Stellen Sie bei der Entwicklung sicher, dass Sie den richtigen Datentyp für die Spalte auswählen. Daten sollten Datumsvariablen sein, Zahlen sollten ein numerischer Typ sein usw. Dies wird besonders wichtig, wenn wir uns mit einem späteren Thema befassen: Indizierung; Im Folgenden werde ich jedoch ein Beispiel für schlechte Kenntnisse der Datentypen demonstrieren:

Sieht gut aus, basierend auf dem, was wir derzeit wissen, richtig? Was ist jedoch, wenn employeeID tatsächlich eine Zeichenfolge ist? Jetzt haben wir ein Problem, weil das DBMS möglicherweise keine Übereinstimmung findet (weil String-Datentypen und Ganzzahlen unterschiedliche Typen sind).

Wenn Sie die Indizierung verwenden, werden Sie wahrscheinlich verwirrt sein, warum Ihre Abfrage ewig dauert, wenn es sich um einen einfachen Index-Scan handeln sollte. Aus diesem Grund müssen Entwickler den Datentypen und ihren Anwendungen besondere Aufmerksamkeit widmen. Nicht-Schlüsselattribute, bei denen es sich um IDs handelt, sind aufgrund der erhöhten Flexibilität, die gewährt wird, häufig Zeichenfolgentypen im Gegensatz zu Ganzzahlen. Dies ist jedoch auch ein Problembereich für Nachwuchsentwickler, die davon ausgehen, dass ID-Felder Ganzzahlen sind.

Die ordnungsgemäße Verwendung von Datentypen ist für eine ordnungsgemäße Datenbankprogrammierung von entscheidender Bedeutung, da sie direkt zur Effizienz der Abfrage führen. Effiziente Abfragen sind für die Erstellung hochwetiger, skalierbarer Anwendungen unerlässlich.

5. Schreiben Sie den kompatiblen Code

Alle Programmiersprachen haben Standards, die Webentwickler kennen sollten, und SQL ist nicht anders. SQL wurde von ANSI und dann von ISO standardisiert, wobei gelegentlich neue Überarbeitungen der Sprache eingereicht wurden. Die neueste Version ist SQL: 2008, obwohl die wichtigste Version, die Entwickler kennen sollten, SQL:1999 ist. Mit der Revision von 1999 wurden rekursive Abfragen, Trigger, Unterstützung für PL/SQL und T-SQL sowie einige neuere Funktionen eingeführt. Es wurde auch definiert, dass die JOIN-Anweisungen in der FROM-Klausel und nicht in der WHERE-Klausel ausgeführt werden.

Beachten Sie beim Schreiben von Code, warum standardkonformer Code nützlich ist. Es gibt zwei Hauptgründe, warum Standards verwendet werden. Das erste ist die Wartbarkeit und das zweite ist die plattformübergreifende Standardisierung. Wie bei Desktop-Anwendungen wird davon ausgegangen, dass Websites eine lange Lebensdauer haben und verschiedene Updates durchlaufen, um neue Funktionen hinzuzufügen und Probleme zu beheben. Wie Ihnen jeder Systemanalyst sagen wird, verbringen Systeme einen Großteil ihrer Lebensdauer in der Wartungsphase. Wenn ein anderer Programmierer in 2, 5 oder 10 Jahren auf Ihren Code zugreift, kann er dann trotzdem verstehen, was Ihr Code tut? Standards und Kommentare sollen die Wartbarkeit fördern.

Der andere Grund ist die plattformübergreifende Funktionalität. Mit CSS gibt es derzeit einen ständigen Standardkampf zwischen Firefox, Internet Explorer, Chrome und anderen Browsern um die Interpretation von Code. Der Grund für die SQL-Standards besteht darin, eine ähnliche Situation zwischen Oracle, Microsoft und anderen SQL-Varianten wie MySQL zu verhindern.

6. Normalisieren Sie Ihre Daten

Die Datenbanknormalisierung ist eine Technik zum Organisieren des Inhalts von Datenbanken. Ohne Normalisierung können Datenbanksysteme ungenau, langsam und ineffizient sein. Die Community von Datenbankfachleuten entwickelte eine Reihe von Richtlinien für die Normalisierung von Datenbanken. Jede "Ebene" der Normalisierung wird als Formular bezeichnet, und es gibt insgesamt 5 Formulare. Die erste Normalform ist die niedrigste Normalisierungsebene, bis zur fünften Normalform die höchste Normalisierungsebene.

  • Erste Normalform (1NF): Die grundlegendste Ebene der Datennormalisierung, die erste Normalform, erfordert die Eliminierung aller doppelten Spalten in einer Tabelle sowie die Erstellung separater Tabellen für verwandte Daten und die Identifizierung jeder Tabelle mit einem Primärschlüssel Attribut.
  • Zweite Normalform (2NF): Erfüllt alle Anforderungen der ersten Normalform und erstellt mithilfe von Fremdschlüsseln Beziehungen zwischen Tabellen.
  • Dritte Normalform (3NF): Erfüllt alle Anforderungen der zweiten und ersten Normalform und entfernt alle Spalten, die nicht vom Primärschlüssel abhängig sind. Die dritte Normalform entfernt auch alle abgeleiteten Attribute wie das Alter.
  • Vierte Normalform (4NF): Die vierte Normalform fügt eine zusätzliche Anforderung hinzu, nämlich das Entfernen mehrwertiger Abhängigkeiten in Beziehungen.
  • Fünfte Normalform (5NF): Die fünfte Normalform ist eine seltenere Form der Normalisierung. In diesem Fall werden Verknüpfungsabhängigkeiten durch Kandidatenschlüssel (möglicherweise Primärschlüsselwerte) impliziert.

In der Realität der Datenbankentwicklung ist der Einstieg in 3NF der wichtigste Sprung. 4NF und 5NF sind eher ein Luxus (und manchmal ein Ärgernis) in der Datenbankentwicklung und werden in der Praxis selten gesehen. Wenn Sie mit den Konzepten zu kämpfen haben oder sich an die ersten drei Formen erinnern, gibt es eine einfache Beziehung. "Der Schlüssel, der ganze Schlüssel und nichts als der Schlüssel.", Der sich auf 1NF, 2NF und 3NF bezieht.

Die Vorteile der Normalisierung

Konzentrieren wir uns jetzt, ohne zu weit in die Datenbanktheorie zu gehen, einfach auf die Vorteile der Normalisierung. Während die Daten die Normalisierungsformulare durchlaufen, werden sie sauberer, besser organisiert und schneller. Bei einer kleinen Datenbank mit nur 5 Tabellen und 100 Datenzeilen ist dies nicht ohne weiteres ersichtlich. Wenn die Datenbank wächst, werden die Auswirkungen der Normalisierung jedoch in Bezug auf die Geschwindigkeit und die Aufrechterhaltung der Datenintegrität viel deutlicher. Es gibt jedoch Situationen, in denen eine Normalisierung keinen Sinn ergibt, z. B. wenn beim Normalisieren der Daten übermäßig komplexe Abfragen erstellt werden, die zum Zurückgeben der Daten erforderlich sind.

7. Qualifizieren Sie Ihre Datenbankobjektnamen vollständig

Dies ist ein häufig ignorierter Punkt. Tatsächlich hat der gesamte Beispielcode, den ich in diesem Tutorial demonstriert habe, diesen Tipp im Wesentlichen verletzt. In Bezug auf die Datenbankentwicklung sieht ein vollständig qualifizierter Objektname wie folgt aus: DATABASE.schema.TABLE. Schauen wir uns nun an, warum vollqualifizierte Namen wichtig sind und in welchen Situationen sie notwendig sind. Der Zweck eines vollständig qualifizierten Objektnamens besteht darin, Mehrdeutigkeiten zu beseitigen. Anfängliche Entwickler haben selten Zugriff auf mehrere Datenbanken und Schemas, was die zukünftigen Probleme erschwert. Wenn ein bestimmter Benutzer Zugriff auf mehrere Datenbanken, mehrere Schemas und die darin enthaltenen Tabellen hat, ist es wichtig, direkt anzugeben, auf was der Benutzer zugreifen möchte. Wenn Sie eine Mitarbeitertabelle haben, hat Ihr Chef eine Mitarbeitertabelle, und das Schema, auf dem Ihre Webanwendung ausgeführt wird, enthält eine Mitarbeitertabelle. Auf welche Tabelle möchten Sie wirklich zugreifen?

Logischerweise würde der vollständig qualifizierte Name wie DATABASE.SCHEMA.OBJECTNAME aussehen, jedoch syntaktisch (dh in ausführbaren Anweisungen) einfach SCHEMA.OBJECTNAME. Obwohl verschiedene DBMS unterschiedliche Syntaxunterschiede aufweisen, ist der obige Stil allgemein anwendbar.

Die vollständige Qualifizierung Ihrer Datenbanknamen ist wichtig, wenn Sie mit Datenbanken arbeiten, die größer sind und von mehreren Benutzern verwendet werden und mehrere Schemas enthalten. Es ist jedoch eine gute Angewohnheit, sich darauf einzulassen.

8. Indizierung verstehen

Ein Datenbankindex ist eine Datenstruktur, die die Geschwindigkeit von Operationen in einer Datenbanktabelle verbessert. Indizes können mithilfe einer oder mehrerer Spalten einer Datenbanktabelle erstellt werden. Dies ist die Grundlage für schnelle zufällige Suchvorgänge und den effizienten Zugriff auf geordnete Datensätze. Die Indizierung ist unglaublich wichtig, wenn Sie mit großen Tabellen arbeiten. Gelegentlich sollten jedoch kleinere Tabellen indiziert werden, wenn erwartet wird, dass sie wachsen. Kleine Tabellen, die klein bleiben, sollten jedoch nicht indiziert werden (wenn Ihr Buch beispielsweise 1 Seite umfasst, ist es sinnvoll, sich dem Index zuzuwenden?)

Viele Entwickler schreiben ihren Code und testen ihn in einer Tabelle mit 10 oder 100 Zeilen. Sie sind zufrieden, wenn ihr Code eine angemessene Leistung erbringt. Wenn die Tabelle jedoch auf 10.000 oder 1.000.000 Zeilen anwächst, verlangsamt sich der Code im Schneckentempo, und der Client kann genauso gut zum Mittagessen gehen und auf die Ausführung des Codes warten.

Wenn eine Abfrage eine Datenbank nach einem passenden Datensatz durchsucht, gibt es zwei Möglichkeiten, wie die Suche durchgeführt werden kann.

  • Der erste und langsamste Weg ist ein Tabellenscan. Bei einem Tabellenscan durchsucht die Abfrage jeden Datensatz in der Tabelle nach einer Übereinstimmung.
  • Der zweite und schnellere Weg ist ein Index-Scan. Bei einem Index-Scan durchsucht die Abfrage den Index, um den Datensatz zu finden. In nicht datenbankbezogenen Begriffen entspricht ein Tabellenscan dem Lesen jeder Seite in einem Buch, das nach einem Wort sucht, während ein Indexscan dem Umblättern zum hinteren Teil des Buches, dem Auffinden des Wortes und dem Umblättern zum angegebenen Wort entspricht Seite, und lesen Sie dann die Wörter auf der Seite, um das Wort zu finden.

Es ist wichtig zu beachten, dass Indizes gelegentlich neu erstellt werden müssen, wenn aten zur Tabelle hinzugefügt werden. Indizes erhöhen zwar die Datenzugriffsleistung, verlangsamen jedoch die Änderung von Daten. Aus diesem Grund haben die meisten DBMS die Option, einen Index vorübergehend zu deaktivieren, um die Änderung von Massendaten zu erleichtern, und ihn dann wieder zu aktivieren und später neu zu erstellen.

9. Verwenden Sie die Datenbankberechtigungen ordnungsgemäß

Wenn Sie mit einer Datenbank mit mehreren Benutzern arbeiten, ist es wichtig, verschiedene Datenbankberechtigungen ordnungsgemäß zu behandeln. Natürlich haben die meisten Datenbanken einen Administrator, aber ist es immer sinnvoll, Ihre Abfragen als Administrator auszuführen? Möchten Sie außerdem all Ihren Nachwuchsentwicklern und Benutzern Ihre Administratoranmeldeinformationen zur Verfügung stellen, um ihre Abfragen zu schreiben? Höchst wahrscheinlich nicht. Die verschiedenen möglichen Berechtigungen für Ihre Datenbank hängen von Ihrem DBMS ab, es gibt jedoch gemeinsame Themen.

Wenn Sie beispielsweise in MySQL "SHOW TABLES" eingeben, wird eine Liste der Tabellen in Ihrer Datenbank angezeigt, von denen Sie wahrscheinlich eine "Benutzer" -Tabelle bemerken werden. Wenn Sie 'DESC user' eingeben, wird angezeigt, dass die Benutzertabelle verschiedene Felder enthält. Neben einem Host, einem Benutzernamen und einem Kennwort gibt es auch eine Liste von Berechtigungen, die für einen Benutzer festgelegt werden können. arüber hinaus gibt es eine 'db'-Tabelle, die mehr Berechtigungen für eine bestimmte Datenbank regelt.

SQL Server bietet die Anweisungen GRANT, DENY und REVOKE, um einem Benutzer oder einer Rolle Berechtigungen zu erteilen oder zu entziehen. Darüber hinaus bietet SQL Server Rollen wie db_writer und db_reader. Unbekannte Entwickler gewähren diese Rollen häufig anderen Benutzern (im Gegensatz zum Erstellen eigener, benutzerdefinierter Rollen), was zu einer insgesamt verringerten Datenbanksicherheit sowie der Möglichkeit führt, dass ein Benutzer einen unerwünschten Vorgang ausführt.

Die ordnungsgemäße Verwaltung der Berechtigungen Ihrer Datenbankbnutzer ist nicht nur für die Verwaltung der Sicherheit von entscheidender Bedeutung, sondern bietet auch eine Grundlage für eine schnellere Entwicklung und den Schutz der Datenintegrität.

10. Kennen Sie Ihre DBMS-Einschränkungen

Datenbanken sind leistungsstarke Werkzeugs, jedoch nicht ohne Einschränkungen. Oracle, SQL Server und MySQL haben alle eindeutige Einschränkungen in Bezug auf Dinge wie maximale Datenbankgrößen, maximale Anzahl von Tabellen und andere. Viele Entwickler wählen unwissentlich eine DBMS-Lösung für ihr Projekt, ohne die späteren Anforderungen ihrer Datenbank zu planen oder zu berücksichtigen.

Informationen zu den verschiedenen Einschränkungen finden Sie in Ihrem DBMS-Handbuch. SQL Server-Einschränkungen finden Sie beispielsweise auf der MSDN-Website: http://msdn.microsoft.com/en-us/library/ms143432.aspx

Abschluss

In diesem Artikel haben wir 10 wichtige Tipps für SQL-Entwickler besprochen. Es gibt jedoch viele andere nützliche SQL-Techniken, die erwähnt werden könnten. Bitte hinterlassen Sie Ihre Gedanken in den Kommentaren, ob Sie der Meinung sind, dass dieser Artikel alle wesentlichen Themen abdeckt, oder ob Sie der Meinung sind, dass einer ausgelassen wurde. Entwickeln Sie weiter und denken Sie daran, dass der von Ihnen geschriebene Code die Internetinfrastruktur unterstützt. Ohne Sie wäre das Internet nicht so erfolgreich wie es ist.

  • Folgen Sie uns auf Twitter oder abonnieren Sie den NETTUTS RSS-Feed, um weitere tägliche Tipps und Artikel zur Webentwicklung zu erhalten.


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.