Namenskonventionen für Spaltennamen und Best Practices

19

Ich hätte gerne eine Expertenmeinung zu Best Practices, wenn es um die Benennung von Spalten geht .

Hintergrund ist laut Wikipedia folgende Syntax:

SELECT ... FROM Employees JOIN Timesheets USING (EmployeeID);

ist effizienter als

SELECT ... FROM Employees JOIN Timesheets ON (Employees.EmployeeID = Timesheets.EmployeeID);

Die JOIN ... USINGSyntax funktioniert jedoch nur für alle Primärschlüsselspalten, die global eindeutige Namen haben . Daher frage ich mich, ob dies als das Richtige angesehen wird.

Persönlich habe ich immer Tabellen mit PK-Spalte idund Fremdschlüsselspalte erstellt othertable_id. Aber auf diese Weise ist es nicht möglich, USINGoder zu verwenden NATURAL JOIN.

Alle Links zu Designstilen oder Best-Practice-Anleitungen für die Tabellengestaltung sind ebenfalls willkommen!

Kerrek SB
quelle
3
Wikipedia ist falsch. Die erste Version ist keineswegs effizienter als die zweite. Unter der Haube wird die Datenbank absolut identische Abfragen erstellen
a_horse_with_no_name

Antworten:

13

Dies wurde schon vorher auf SO gefragt.

Wenn Sie gemeinsame und sehr mehrdeutige Namen haben, stellen Sie den Tabellennamen voran. Das heißt, alles, was Sie möglicherweise in fast jeder Abfrage als Alias ​​angeben müssen.

Also für einen Mitarbeitertisch hätte ich

EmployeeID
EmployeeName
Comment
Salary
StartDate
EndDate
InsertedDateTime
...

Und Wikipedia sagt tatsächlich:

Das USING-Konstrukt ist jedoch mehr als nur syntaktischer Zucker, da sich die Ergebnismenge von der Ergebnismenge der Version mit dem expliziten Prädikat unterscheidet. Insbesondere werden alle in der USING-Liste genannten Spalten nur einmal mit einem nicht qualifizierten Namen und nicht einmal für jede Tabelle im Join angezeigt.

Das ist eine Spalte weniger. Du würdest SELECT *sowieso nie verwenden, also ist der Punkt strittig ...

gbn
quelle
Ich hatte nicht daran gedacht, mich so albern zu suchen. Haben Sie Links zu besonders guten SO-Fragen? Wie auch immer, danke, ich werde mich von nun an an die "eindeutige ID" halten!
Kerrek SB
@ Kerrk SB: Eigentlich habe ich nicht. Ich neige dazu, sie zu ignorieren, weil jeder schnell beantwortet oder geschlossen wird :-) Sorry
gbn
Ich würde gerne ähnliche Fragen zu SO sehen, wenn jemand einen Link ausgraben kann. Ich bin hierher gekommen, weil ich dort keine Frage gefunden habe und ich war mir sicher, dass sie schon gestellt worden wäre. Ich habe diese Frage jedoch sofort gefunden.
Nicholas Shanks
Es war auf Programmierer.SE. Ein netter großer Brötchenkampf für dich ... programmers.stackexchange.com/questions/114728/…
gbn
6

Das folgende Buch befasst sich mit der Verwendung von ID als SQL-Antimuster, und ich stimme dem Autor zu, dass dies der Fall ist. http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1330025134&sr=1-1

Dies ist ein besonderes Problem, wenn Sie komplexe Berichte erstellen und mehr als eine ID benötigen, da Sie dann einen Alias ​​erstellen müssen. Die Verwendung der Tabellennamen-ID erleichtert auch die Identifizierung der richtigen FK, zu der eine Verbindung hergestellt werden soll (da sie denselben Namen haben), und verringert die Wahrscheinlichkeit, dass Fehler beim Verbinden mit der falschen Sache auftreten.

Das heißt, viele Datenbanken unterstützen nicht die USING-Syntax, wodurch das von Ihnen angesprochene Problem für diese Datenbanken kein Problem darstellt. Viele Datenbanken unterstützen auch nicht die Verwendung eines natürlichen Joins wenn sich die Tabellenstrukturen ändern. Nehmen wir also an, Sie fügen beiden Tabellen ein Feld mit dem Namen modifieddate hinzu, und Sie möchten nicht daran teilnehmen, aber der natürliche Join würde dies tun.

HLGEM
quelle
4

Es ist besser, Tabellennamen und Spaltennamen wie Employees.EmployeeID mit Ausdrücken anzugeben, bei denen ein Join vorhanden ist

Eralper
quelle