SQL

Generell

  • Undokumentierte Features werden grundsätzlich nicht eingesetzt.
  • Datenbanken sollten das Charset UTF-8 verwenden.

Sicherheit

  • Grundsätzlich erhält jede Datenbank einen eigenen Login (Benutzername/Passwort) zur Kommunikation mit Webapplikationen.
  • Der Login für eine Datenbank besitzt keine Administratoren-Rechte.

Tabellen

  • Bei Tabellennamen ist der Plural vorzuziehen. Zum einen können damit Konflike mit SQL-Keywords vermieden werden, und zum anderen entspricht dies dem Sinn einer Datenbank als Informationsträger besser.
  • Tabellennamen werden deutsch oder englisch geschrieben, wobei englisch vorzuziehen ist. Im Zweifelsfall aber lieber die korrekte deutsche Bezeichnung als eine missverständliche oder falsche in einer anderen Sprache.
  • Tabellennamen sind generell klein zu schreiben.
  • Tabellen sollten nach Möglichkeit einen Präfix erhalten, damit sie eindeutig einem Applikationsteil zugeordnet und problemloser in eine bereits existierende Datenbank übernommen werden können. Treenzeichen für den Präfix ist _
    Beispiel: blog_, wiki_, tk_
  • Join-Tabellen erhalten den Suffix _join und sind nach dem Muster tabelle1_tabelle2_join aufgebaut.
  • Join-Tabellen enthalten einen Primärschlüssel.
  • Jede Tabelle enthält einen Primärschlüssel.

Spalten

  • Für Primärschlüssel (Primary Keys) sollen grundsätzlich als UUIDs (Strings)verwendet werden. Damit wird die Portabilität der Datenbank erhöht. Bei reinen Jointabellen kann der Primärschlüssel auch ein numerischer Autowert sein.
  • Spaltenname sollten lowercase geschrieben werden (Beispiel: summary nicht Summary)
  • Die Spalte 'id' als Primärschlüssel in der Haupttabelle erhält keinen Präfix des Tabellennamens (Bsp: nur id und nicht userid).
  • In Jointabellen wird der Fremdschlüssel mit nach dem Muster 'tabellenname_id' definiert.
  • Folgende Spalten sollten in Datentabellen vorkommen:
Spalte Typ Pflicht Bemerkung
id varchar, uid * Primary
dte_new datetime *  
dte_change datetime *  
dte_delete datetime *  

Abfragen / Queries

  • SQL-Keywords werden versal geschrieben (Bsp: SELECT, INSERT, WHERE, ORDER usw).
  • Abfragen mit Wildcards (*,%) sind in den seltensten Fällen optimal. Der bekannt SELECT * ist generell zu vermeiden.
  • Enthält eine Abfrage mehrere Statements, ist jedes einzelne Statement mit einem Semikolon ; abzuschliessen.
  • SQL-Statements werden leserlich formuliert:
    Beispiel 1: Einfacher Select
    SELECT	spalte1, spalte2
    FROM	tabelle 
    WHERE	spalte3 = 10
        AND spalte4 = 'Haus'
    ORDER BY spalte5
    
  • Beispiel 2: Select mit Join-Tabellen
    SELECT	tab1.spalte1, tab1.spalte2,
        tab2.spalte1, tab2.spalte2
    FROM	tabelle1 tab1
        INNER JOIN tabelle2 tab2
            ON tab1.spalteid = tab2.spalteid 
    WHERE	tab1.spalte3 = 10
        AND tab2.spalte3 = 'Haus'
    ORDER BY tab1.spalte4
    
    Oder
    
    SELECT	tabelle1.spalte1, tabelle1.spalte2,
        tabelle2.spalte1, tabelle2.spalte2,
    FROM	tabelle1
        INNER JOIN tabelle2
            ON tabelle1 .spalteid = tabelle2.spalteid 
    WHERE	tabelle1.spalte3 = 10
        AND tabelle2.spalte3 = 'Haus'
    ORDER BY tabelle1.spalte4
    Verknüpfungsanweisungen und logische Operatoren werden dabei auf der gleichen Zeile geschrieben, wie die effektive Anweisungen:
    ...
    INNER JOIN tabelle2
        ON tabelle1.spalteid = tabelle2.spalteid
    ...
    AND tabelle2.spalte3 = 'Haus'
    
     
    

    Verknüpfungsanweisungen und logische Operatoren werden dabei auf der gleichen Zeile geschrieben, wie die effektive Anweisungen:
    …
    INNER JOIN tabelle2
        ON tabelle1.spalteid = tabelle2.spalteid
    …
    AND tabelle2.spalte3 = 'Haus'
    
     
    
  • Aliase für Tabellennamen sind zulässig, sollten aber zur besseren Lesbarkeit selten verwendet werden.

Indexe

  • Indexe sind bewusst einzusetzen. Sie können Abfragen massiv beschleunigen, aber nur wenn sie korrekt und vor gezielt eingesetzt werden.
  • Indexe lohnen sich vor allem dann, wenn die indizierten Spalten häufig in folgenden SQL-Klauseln vorkommen: WHERE, ORDER BY, GROUP BY, TOP und DISTINCT.
  • In diesen Situationen ist die Erstellung eines Indexs selten ratsam:
    - Kleine Tabellen benötigen in der Regel keinen Index.
    - Spalten mit grossen Datenmengen sind unbedingt geeignet, beispielsweise bei TEXT-Spalten
    - Werden die Daten einer Tabelle häufig mutiert und selten gelesen, ist die Aktualisierung des Indexes aufwändiger als der Gewinn durch schnellere Abfragen wett machen könnte.
    - Wird bei der Analyse des Execution Plan festgestellt, dass ein vorhandener Index nicht verwendet worden ist, sollte man ihn auch nicht weiter einsetzen und pflegen.

Kommentare

  • Benutze Kommentare in Store Procedures, Funktionen und anderen SQL-Scripts.

Tipps

SQL allgemein

MSSQL

MySQL

Postgre

externe Quellen

Dokumentationen

CheatSheets

Code-Formatierung

Datenbank-Konvertierung

nach PostgreSQL

Code-Beispiele