2016-02-22 7 views
5

Ich habe eine praktische Frage bezüglich der Benennung von Tabellenfeldern in einer Datenbank. Zum Beispiel habe ich zwei Tabellen:Namenskonvention für Tabellenfelder und SQL-Anweisungen

student (id int; name varchar(30)) 
teacher (id int, s_id int; name varchar(30)) 

Es gibt beide "ID" und "Name" in zwei Tabellen. In der SQL-Anweisung ist es für die beiden nicht eindeutig, wenn keine Tabellennamen vorangestellt sind. Zwei Optionen:

  1. Verwendung Tabellenname als Präfix eines Feldes in SQL ‚wo‘ Klausel
  2. Verwendung Präfix Feldnamen in Tabellen, so dass kein Präfix wird in ‚where‘ Klausel verwendet werden.

Welches ist besser?

Antwort

2

Bei Abfragen, die nicht ad-hoc sind, sollten Sie immer Präfix mit jedem Feld entweder den Tabellennamen oder Tabellenalias, auch wenn die Feldname ist nicht mehrdeutig. Dies verhindert, dass die Abfrage später unterbrochen wird, wenn jemand eine neue Spalte zu einer der Tabellen hinzufügt, die Mehrdeutigkeit hervorruft.

Also das würde "ID" und "Name" eindeutig machen. Aber ich empfehle immer noch, den Primärschlüssel mit etwas spezifischerem als "id" zu benennen. In Ihrem Beispiel würde ich student_id und teacher_id verwenden. Dies hilft Fehler in Joins zu vermeiden. Sie werden sowieso mehr spezifische Namen benötigen, wenn Sie Tabellen mit mehr als einem eindeutigen Schlüssel oder mehrteiligen Schlüsseln aufrufen.

Es lohnt sich, diese Dinge durch zu denken, aber am Ende kann Konsistenz wichtiger sein. Ich kann mit Tabellen umgehen, die um id anstelle von student_id gebaut wurden, aber ich arbeite derzeit mit einem inkonsistenten Schema, das alle folgenden Elemente verwendet: id, sid, systemid und spezifische Namen wie taskid. Das ist das Schlimmste von beiden Welten.

+1

Ja, qualifiziere immer ** alle ** Spaltenreferenzen in einer Abfrage. Es verhindert, dass die Abfrage in Zukunft unterbrochen wird, wenn jemand eine Spalte in einer Tabelle hinzufügt (wodurch mehrdeutige Spaltenreferenzfehler eingeführt werden). Und es macht es für einen späteren Leser leichter, die SQL zu entziffern ... die unqualifizierte Referenz auf die 'foobar'-Spalte ... ist, dass ein Verweis auf eine Spalte in der 'feed'-Tabelle, der' fi'-Tabelle oder der ' FO' Tisch? (Wage es nicht, mich durch die Tabellendefinitionen jagen zu lassen, um herauszufinden, auf welche Tabelle ich mich beziehe.) Aber meine persönliche Vorliebe besteht darin, die Spalte "id" zu benennen, wo es der primäre (oder eindeutige) Schlüssel ist. – spencer7593

0

Wenn es nicht zu lange wird, bevorzuge ich Präfix in der Tabelle selbst, z. teacher.teacher_id, student.student_name. Auf diese Weise sind Sie immer sicher, über welchen Namen oder welche ID Sie sprechen, auch wenn Sie den Tabellennamen vorwählen müssen.

3

Ohne Zweifel, gehen Sie mit Option 1. Dies ist in jeder Art von Datenbank SQL gültig und betrachtete das richtige und am besten lesbare Format. Es ist eine gute Angewohnheit, den Tabellennamen einer Spalte vorangestellt zu haben, und sehr wichtig, wenn ein Join durchgeführt wird. Die einzige Ausnahme, die ich am häufigsten gesehen habe, ist das Voranstellen der ID-Spalte mit dem Tabellennamen, aber das würde ich immer noch nicht tun.
Wenn Sie mit Option 2 gehen, werden erfahrene DBAs wahrscheinlich auf Sie zeigen und lachen.
Für weitere Beweise, siehe # 2 hier: https://www.periscopedata.com/blog/better-sql-schema.html
Und hier. Regel 1b - http://www.isbe.net/ILDS/pdf/SQL_server_standards.pdf

Wie TT erwähnt, werden Sie Ihr Leben viel einfacher machen, wenn Sie lernen, eine alias für den Tabellennamen zu verwenden. Es ist so einfach wie mit SomeTableNameThatsWayTooLong as long_table in Ihrer Abfrage, wie zB:

SELECT LT.Id FROM SomeTableNameThatsWayTooLong AS LT 
+1

So über Ihre Wahl bevorzugt werden, soll ich nicht Feldnamen verwenden wie "student_ID", "teach_ID", "student_name", "teacher_name", aber nur "id" und "name" in beiden Tabellen. Recht? – marlon

+0

In welcher Datenbank würde eine Spalte namens "student_id" zu ungültigem SQL führen? – Bampfer

+0

Ich habe nicht gesagt, dass es zu ungültigem SQL führen würde. Ich sagte, dass die Verwendung von "ID" oder "Name" immer gültig ist, solange Sie dies mit dem Tabellennamen qualifizieren. Die Benennung jeder Spalte student_id, student_name, student_dorm, student_major usw. wird deine Entwickler verrückt machen und ist unnötig. – Ageonix

2

Ich würde Aliase anstelle von Tabellennamen verwenden.

Sie können einer Tabelle in einer Abfrage eine alias zuweisen, die kürzer als der Tabellenname ist. Das macht die Abfrage viel lesbarer.Beispiel:

SELECT 
    t.name AS teacher_name, 
    s.name AS student_name 
FROM 
    teacher AS t 
    INNER JOIN student AS s ON 
     s.id=t.s_id; 

Sie können natürlich die Tabellennamen verwenden, wenn Sie keine Aliase verwenden, und das wäre in diesem Fall 2.

+2

Persönlich würde ich bevorzugen, dass die Fremdschlüsselspalte nach dem Muster ** 'referenced_table_id' benannt wird. ** Zum Beispiel,' student_id', anstatt 's_id'. Abgesehen davon ist dies das Muster, dem ich folge. – spencer7593

+1

Guter Aufruf bei der Erwähnung von Alias ​​'. Unsere Datenbankadministratoren verwenden verrückte lange Namen und tippen StudentClassListDetails vor jeder Spalte ein. Die Syntax hängt vom Datenbanktyp ab, aber ich denke, die meisten von ihnen sind so einfach wie 'StudentClassListDetails als scld' – Ageonix

+1

@ spencer7593 Guter Punkt, klare Namen zu haben ist wichtig, um Verwirrung in großen Datenbanken mit vielen verwandten Tabellen zu vermeiden. –