Kann jemand Codierungsstandards für TSQL empfehlen?

9

Wir haben seit langem Codierungsstandards für unseren .Net-Code, und es scheint mehrere seriöse Quellen für Ideen zu geben, wie diese angewendet werden können, die sich im Laufe der Zeit weiterentwickeln.

Ich möchte in der Lage sein, einige Standards für SQL zusammenzustellen, die für die Verwendung durch unsere Produkte geschrieben wurden, aber es scheint keine Ressourcen für den Konsens darüber zu geben, was gut geschriebenes SQL bestimmt.

Rowland Shaw
quelle
1
Pinal Dave hat eine Liste von Codierungsstandards auf seiner Website . Sie sehen aus wie eine faire Grundlage für eine Reihe von Standards.
Will A
1
Es gibt eine verwandte Frage zu SO .
Scott Whitlock
1
@Scott, der nur die Identifizierung abdeckt; nichts über Benennung, Verwendung von Cursorn / gespeicherten Prozeduren / Auswahl des Datentyps oder irgendetwas, das tatsächlich die Qualität des Codes beeinflusst ...
Rowland Shaw
1
genau deshalb habe ich gesagt, es sei "verwandt", kein "Duplikat".
Scott Whitlock

Antworten:

6

Nach meiner Erfahrung wären die wichtigsten Dinge, nach denen ich suchen würde:

  • Tabellen- und Spaltenbenennung - Überprüfen Sie, ob Sie ID, Referenz oder Nummer für Spalten vom Typ ID, Singular oder Plural für Namen verwenden (Plural ist für Tabellennamen üblich - z. B. THINGS, Singular für Spaltennamen - z. B. THING_ID). Für mich ist das Wichtigste hier die Konsistenz, die verhindert, dass Menschen Zeit verschwenden (zum Beispiel stoßen Sie nicht auf Tippfehler, bei denen jemand THING als Tabellennamen eingegeben hat, weil Sie nur intuitiv wissen, dass Tabellennamen niemals singulär sind).

  • Alle Erstellungen sollten einen Drop (abhängig vom vorhandenen Objekt) als Teil ihrer Datei enthalten. Möglicherweise möchten Sie auch die Berechtigung zum Erteilen von Berechtigungen bis zu Ihnen hinzufügen.

  • Auswählen, Aktualisieren, Einfügen und Löschen sollten einen Spaltennamen, einen Tabellennamen und eine where-Klausel / Reihenfolge nach Klausel pro Zeile enthalten, damit sie während des Debuggens einzeln leicht auskommentiert werden können.

  • Präfix für Objekttypen, insbesondere dort, wo sie verwirrt sein könnten (daher ist v für die Ansicht am wichtigsten). Ich bin mir nicht sicher, ob es noch zutrifft, aber es war früher ineffizient, wenn andere gespeicherte Prozeduren als Systemprozeduren mit sp_ beginnen. Wahrscheinlich die beste Vorgehensweise, um sie trotzdem zu unterscheiden. Usp_ war das, was ich zuletzt verwendet habe.

  • Ein Standard, der angibt, wie der Name eines Triggers enthalten soll, ob er aktualisiert / eingefügt / gelöscht werden soll, und für welche Tabelle er gilt. Ich habe keinen bevorzugten Standard, aber dies sind wichtige Informationen und müssen leicht zu finden sein.

  • Standard für den Besitz von Objekten in früheren Versionen von SQL Server oder das Schema, in dem es für 2005 und höher vorhanden sein sollte. Es ist Ihr Aufruf, was es ist, aber Sie sollten niemals raten, wem etwas gehört / wo es lebt. Wenn möglich, sollte das Schema / der Eigentümer in die CREATE-Skripte aufgenommen werden, um die Möglichkeit einer falschen Erstellung zu minimieren.

  • Ein Indikator dafür, dass jeder, der SELECT * verwendet, dazu gebracht wird, ein halbes Liter seines eigenen Urins zu trinken.

  • Sofern es keinen wirklich, wirklich guten Grund gibt (der Ihre Faulheit nicht einschließt), müssen Sie die Beziehungen zwischen Primärschlüssel und Fremdschlüssel von Anfang an haben, durchsetzen und aufrechterhalten. Dies ist schließlich eine relationale Datenbank, keine Flatfile, und verwaiste Datensätze werden Ihr Support-Leben irgendwann zur Hölle machen. Bitte beachten Sie auch, dass ich Ihnen versprechen kann, dass Sie es nach dem Ereignis nie schaffen werden, wenn Sie es jetzt nicht tun, da es zehnmal so viel Arbeit kostet, sobald Sie Daten haben (was ein bisschen durcheinander ist, weil Sie es nie erzwungen haben die Beziehungen richtig).

Ich bin mir sicher, dass ich etwas verpasst habe, aber für mich sind es diejenigen, die in einer anständigen Anzahl von Situationen tatsächlich einen echten Nutzen bieten.

Aber wie bei allen Standards ist weniger mehr. Je länger Ihre Codierungsstandards sind, desto weniger wahrscheinlich ist es, dass Benutzer sie lesen und verwenden. Sobald Sie ein paar gut verteilte Seiten hinter sich haben, versuchen Sie, die Dinge zu löschen, die in der realen Welt keinen wirklichen praktischen Unterschied machen, weil Sie nur die Wahrscheinlichkeit verringern, dass Leute etwas davon tun.

BEARBEITEN: Zwei Korrekturen - einschließlich Schemata im Eigentümerbereich, Entfernen eines fehlerhaften Hinweises zur Anzahl (*) - siehe Kommentare unten.

Jon Hopkins
quelle
1
Einige seltsame Entscheidungen ... "SELECT COUNT (*)" ist schlecht? Schon mal was von Schemata gehört (was nicht dasselbe ist wie der Besitzer)? Ihre anderen sind aber gut
gbn
1
@ Jon Hopkins - Ich weiß, warum es schlecht ist, SELECT * zu verwenden. Es wäre großartig, wenn Sie sagen könnten, warum die Verwendung von SELECT COUNT (*) schlecht ist.
25.
1
@gbn @ k25 - Vor ein paar Jahren (2002?) hatte ich einen DBA, der sehr heiß war (*), aber als Antwort auf Ihre Fragen googelte, scheint dies jetzt veraltet zu sein (falls es jemals wahr war). sqlservercentral.com/articles/Performance+Tuning/adviceoncount/… (Registrierung erforderlich). Sie war in erster Linie ein Oracle-DBA, daher war es dort möglicherweise ein echtes Problem, von dem sie vermutete, dass es auch ein Problem für den SQL-Optimierer war.
Jon Hopkins
1
@gbn - Ja, obwohl ich seit ihrer Einführung relativ unkompliziert war, war meine automatische Reaktion Benutzer. Ich werde die Antwort aktualisieren, um Schemata abzudecken.
Jon Hopkins
1
@gbn, @ k25 - Mehr Graben nach Anzahl (*). Anscheinend war dies ein Problem in Oracle 7 und früheren Versionen, das in 8i und darüber hinaus behoben wurde. Nicht klar, ob es jemals ein Problem in SQL Server war, aber sicherlich nicht mehr. Mein DBA war anscheinend veraltet.
Jon Hopkins
3

Es scheint keine Ressourcen für den Konsens darüber zu geben, was gut geschriebenes SQL bestimmt

Das liegt daran, dass es keinen Konsens gibt. Nur als Beispiel hätte ich unterschiedliche Antworten für mindestens die Hälfte der Elemente in Jon Hopkins 'Liste, und basierend auf der Menge an Details auf seiner Liste ist es eine sichere Vermutung, dass wir beide beruflich mit Datenbanken arbeiten.

Trotzdem ist ein Codierungsstandard immer noch eine gute Sache, und ein Standard, den jeder im Team versteht und dem er zustimmt, ist eine bessere Sache, da dieser Standard mit größerer Wahrscheinlichkeit eingehalten wird.

Larry Coleman
quelle
1
+1. Ich denke, das Wichtigste ist, dass Ihr Team konsistent ist.
Dean Harding
1
aus Interesse was würden Sie anders machen? Sind sie größtenteils Geschmackssachen (Layout usw.) oder gibt es "harte" Fehler?
Jon Hopkins
1
@ Jon: Keine harten Fehler, nur subjektive Dinge wie einzelne Tabellennamen, Hass auf Trigger usw. Übrigens, "SELECT *" ist in einem "EXISTS ()" in Ordnung.
Larry Coleman
1
faires Beispiel (und ich benutze es mit EXISTS und zwinge mich nicht, Urin zu trinken).
Jon Hopkins
1

Zusätzlich zu Jon Hopkins 'Antwort ...

  • Trennen Sie interne und externe Objekte

    • IX, UQ, TRG, CK usw. für Einschränkungen und Indizes usw.
    • Kleinbuchstaben oder CapsCase für Kunden, z. B. uspThing_Add
  • Machen Sie sie für interne Objekte explizit, wenn "nicht Standard"

    • UQ = eindeutige Einschränkung
    • UQC = eindeutige Clusterbedingung
    • PK = Primärschlüssel
    • PKN = nicht gruppierter Primärschlüssel
    • IX = Index
    • IXU = eindeutiger Index
    • IXC = Clustered Index
    • IXCU oder IXUC = eindeutiger Clustered-Index
  • Verwenden Sie Schemas, um die Benennung + Berechtigungen zu vereinfachen. Beispiele:

    • Helper.xxx für interne Prozesse
    • HelperFn.xxx für udfs
    • WebGUI.xxx für einen gegenüberliegenden Code
    • Daten und / oder Verlauf und / oder Bereitstellung für Tabellen
gbn
quelle