2009-07-14 1 views
1

Angenommen, ich habe zwei Tabellen in einer Eltern-Kind-Beziehung. Nennen wir sie "Standorte" und "Gebäude", wobei ein "Standort" ein Elternteil eines oder mehrerer "Gebäude" ist. Ich möchte, dass die IDs über Datenbanken hinweg eindeutig sind, daher werde ich GUIDs für die IDs verwenden.Sollte ich generische Namen oder stark typisierte Namen für die Primärschlüssel und Fremdschlüssel in einer Datenbank bevorzugen?

Sollte ich generische Namen für die ID-Felder in den Tabellen oder stark typisierte Namen bevorzugen und warum?

Beispiel 1 (Generic Names):

CREATE TABLE sites (
    id VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

CREATE TABLE buildings (
    id VARCHAR(38) NOT NULL, 
    parent_id VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

Beispiel 2 (stark typisierten Names):

CREATE TABLE sites (
    site_guid VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

CREATE TABLE buildings (
    building_guid VARCHAR(38) NOT NULL, 
    site_guid VARCHAR(38) NOT NULL, 
    -- other attributes 
); 

Antwort

3

Ich bevorzuge die Verwendung von building_id, site_id, so dass der Spaltenname seinen Inhalt mehr als nur "id" definiert.Dies macht es auch möglich, die ANSI Join zu verwenden „mit“ Syntax:

select site.site_id, building.building_id 
from building 
join site using (site_id); 

Ein weiterer Vorteil besteht darin, dass, wenn solche Spalten in Abfragen verwendet werden (oder Ansichten oder Subqueries), sie wieder Aliasing nicht brauchen so oft - wie folgt aus:

select site.id as site_id, building.id as building_id 
from building 
join site on site.id = building.site_id; 
+0

Interessant. Ich war mir dieser ANSI-Syntax nicht bewusst. Vielen Dank. –

+0

@Tony: Ich versuche herauszufinden, was derzeit diese Syntax unterstützt. Haben Sie Referenzen, auf die Sie mich verweisen könnten, um sie zu definieren und vielleicht einen Namen zu geben, nach dem ich dann suchen kann? –

+1

Siehe http://en.wikipedia.org/wiki/Join_(SQL), das sagt "Die USING-Klausel wird von MySQL, Oracle, PostgreSQL und SQLite unterstützt." –

1

Eine Konvention ist alle der Felder in dem Gebäude Tabelle Präfix mit " building_ ", also hätten Sie" building_id "," building_name "usw. Fremdschlüssel, wie zum Beispiel" site_id ", behalten ihren ursprünglichen Namen, was es völlig offensichtlich macht, was vor sich geht.

bearbeiten

Ich sollte erwähnen, dass ich „_id“ über „_uid“ oder „_GUID“ entschieden, weil es nur ein ID-Feld ist so habe ich keinen Grund, seinem Datentyp zu betonen.

+0

die ANSI-Syntax Beispiel von Tony Andrews bietet einen weiteren zwingenden Grund, diese Konvention zu verwenden: es ist nicht nur durch die Abfrage-Generierung Tools unterstützt, sondern auch als eine einfache Art und Weise selbst die Verbindung zu spezifizieren. –

4

ziehe ich einfach id, da dieser Standard Konventionen ist, ist hier ein großer Link für alles Datenbank-Namenskonventionen: http://weblogs.asp.net/jamauss/pages/DatabaseNamingConventions.aspx#Columns

„Rule 2a (Identität Primärschlüsselfelder) - Für Felder, die der Primärschlüssel sind Um eine Tabelle zu identifizieren und jeden Datensatz in der Tabelle eindeutig zu identifizieren, sollte der Name einfach "Id" lauten, da es sich um ein Identifizierungsfeld handelt. Dieser Name steht auch näher an einem Eigenschaftsnamen wie "Id" in Ihren Klassenbibliotheken. Ein weiterer Vorteil dieses Namens ist, dass Sie für Joins so etwas wie "Kunden JOIN Bestellungen ON Customer.Id = Orders.CustomerId" sehen, mit denen Sie das Wort "Customer" ag vermeiden können ain nach der Kundentabelle. "

+1

+1: genau, wie ich es bevorzuge –

+0

Vergleichen Sie das mit "Kunden JOIN Bestellungen auf Customer.CustomerId = Orders.CustomerId". Die ursprüngliche ID und die Verwendung des Fremdschlüssels sind identisch, wodurch Mehrdeutigkeiten beseitigt werden und viele Abfrageentwurfstools automatisch die Joinfelder ermitteln können. –

+1

Oh, und ich wäre vorsichtig mit SQL in Groß- und Kleinschreibung, da die Groß-/Kleinschreibung nicht berücksichtigt wird. Sicherer, ganz unten mit Unterbalken zu verwenden, auch wenn es schlimmer aussieht. –

1

Es ist hauptsächlich eine Frage des Geschmacks. Es sollte eine gewisse Konsistenz über das Projekt geben. Am wichtigsten sind:

  • , die Sie erinnern die Namen repetitiver Spalten, die Sie brauchen nicht in Tabellendefinitionen schauen einfache SQL eingeben fragt
  • , die Sie brauchen nicht in den Code suchen oder Dokumentation zu grob versteht die Bedeutung eine Spalte

persönlich bevorzuge ich Ids mit dem gleichen Namen in dem ganzen Projekt. Es ist auch einfacher, generischen Code zu schreiben, der unabhängig von einer bestimmten Tabelle ist.

Für Fremdschlüssel Normalerweise verwende ich die <ForeignTable>_FK Muster. Wenn in derselben Tabelle mehr als ein Fremdschlüssel vorhanden ist, verwende ich den Rollennamen, wie im objektorientierten Entwurf üblich, <Role>_FK, zum Beispiel CurrentUser_FK.