web-dev-qa-db-de.com

Fremdschlüssel-Benennungsschema

Ich arbeite gerade erst mit Fremdschlüsseln und frage mich, ob es ein Standard-Namensschema für sie gibt?

Angesichts dieser Tabellen:

task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)

Wo Aufgaben Notizen haben, gehören Aufgaben den Benutzern, und die Benutzer verfassen Notizen.

Wie würden die drei Fremdschlüssel in dieser Situation benannt? Oder alternativ spielt es überhaupt eine Rolle ?

Update : Diese Frage bezieht sich auf Fremdschlüsselnamen und nicht auf Feldnamen!

124
nickf

Die Standardkonvention in SQL Server lautet:

FK_ForeignKeyTable_PrimaryKeyTable

Der Schlüssel zwischen Notizen und Aufgaben wäre zum Beispiel:

FK_note_task

Und der Schlüssel zwischen Aufgaben und Benutzern wäre:

FK_task_user

Dadurch erhalten Sie einen Überblick über die am Schlüssel beteiligten Tabellen. So können Sie leicht erkennen, von welchen Tabellen eine bestimmte (von der ersten benannten) abhängt (von der zweiten benannt). In diesem Szenario wäre der vollständige Satz von Schlüsseln:

FK_task_user
FK_note_task
FK_note_user

So können Sie sehen, dass Aufgaben von Benutzern abhängen, und Hinweise von Aufgaben und Benutzern.

153
Greg Beech

Ich benutze zwei Unterstriche als Trennzeichen, d. H. 

fk__ForeignKeyTable__PrimaryKeyTable 

Dies liegt daran, dass Tabellennamen gelegentlich selbst Unterstriche enthalten. Dies folgt der Benennungskonvention für Einschränkungen im Allgemeinen, da die Namen von Datenelementen häufig Unterstriche enthalten, z. 

CREATE TABLE NaturalPersons (
   ...
   person_death_date DATETIME, 
   person_death_reason VARCHAR(30) 
      CONSTRAINT person_death_reason__not_zero_length
         CHECK (DATALENGTH(person_death_reason) > 0), 
   CONSTRAINT person_death_date__person_death_reason__interaction
      CHECK ((person_death_date IS NULL AND person_death_reason IS NULL)
              OR (person_death_date IS NOT NULL AND person_death_reason IS NOT NULL))
        ...
33
onedaywhen

Wie wäre es mit FK_TABLENAME_COLUMNNAME?

KeepItSimpleStupid wann immer möglich.

13
EvilTeach

Normalerweise lasse ich nur meine PK-ID mit dem Namen id und verkette dann meinen Tabellennamen und den Namen der Schlüsselspalte, wenn Sie FKs in anderen Tabellen benennen. Ich mache mir nie die Mühe mit dem Kamel-Gehäuse, weil einige Datenbanken die Groß- und Kleinschreibung ignorieren und ohnehin alle Groß- oder Kleinbuchstaben zurückgeben. Auf jeden Fall würde meine Version Ihrer Tabellen folgendermaßen aussehen:

task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);

Beachten Sie, dass ich meine Tabellen auch im Singular benenne, da eine Zeile eines der Objekte darstellt, die ich persistiere. Viele dieser Konventionen sind persönliche Vorlieben. Ich würde vorschlagen, dass es wichtiger ist, eine Konvention zu wählen und immer zu verwenden, als die Konvention eines anderen anzunehmen.

9
Steve Moyer

Ein Hinweis von Microsoft zu SQL Server:

Eine FOREIGN KEY-Einschränkung muss nicht nur mit einem PRIMARY .__ verknüpft sein. KEY-Einschränkung in einer anderen Tabelle; Es kann auch als Referenz definiert werden die Spalten einer UNIQUE-Einschränkung in einer anderen Tabelle.

also verwende ich Begriffe, die die Abhängigkeit beschreiben, anstelle der herkömmlichen primären/fremden Beziehung.

Beim Referenzieren des PRIMARY KEY der unabhängigen (übergeordneten) Tabelle anhand der gleichnamigen Spalte (n) in der abhängigen (child) Tabelle lasse ich die Spaltennamen weg:

FK_ChildTable_ParentTable

Wenn auf andere Spalten verwiesen wird oder die Spaltennamen zwischen den beiden Tabellen variieren oder nur um explizit zu sein:

FK_ChildTable_childColumn_ParentTable_parentColumn
7
bvj

Dies ist wahrscheinlich ein Over-Kill, aber es funktioniert für mich. Es hilft mir sehr, wenn ich mich besonders mit VLDBs beschäftige. Ich benutze folgendes: 

CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]

Wenn Sie aus irgendeinem Grund nicht auf einen Primärschlüssel verweisen, müssen Sie natürlich auf eine Spalte verweisen, die in einer eindeutigen Einschränkung enthalten ist. In diesem Fall gilt Folgendes: 

CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]

Kann es lange dauern, ja. Hat es geholfen, die Informationen für Berichte frei zu halten, oder hat mir einen schnellen Anflug gegeben, dass das potenzielle Problem während einer Alarmwarnung wäre, würden 100% gerne die Gedanken der Menschen über diese Namenskonvention wissen. 

1
SSISPissesMeOff

Mein gewöhnlicher Ansatz ist

FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference

Oder anders ausgedrückt

FK_ChildColumnName_ParentTableName_ParentColumnName

Auf diese Weise kann ich zwei Fremdschlüssel benennen, die dieselbe Tabelle wie einen history_info table mit column actionBy and actionTo aus der users_info-Tabelle referenzieren

Es wird so sein

FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo

Beachten Sie, dass:

Ich habe den Namen des Kindertabellen nicht angegeben, da es mir normal erscheint, ich bin in der Tabelle des Kindes und kann daher leicht den Namen des Kindes annehmen. Der Gesamtcharakter davon ist 26 und passt gut zu der 30-Zeichen-Grenze von Oracle, die Charles Burns zu einem Kommentar angegeben hat hier

Hinweis für Leser: Viele der unten aufgeführten bewährten Methoden funktionieren nicht in Oracle wegen des Namenslimits von 30 Zeichen. Ein Tabellenname oder Der Spaltenname kann bereits fast 30 Zeichen umfassen, daher eine Konvention Die Kombination der beiden Namen in einem einzigen Namen erfordert einen Abkürzungsstandard oder andere Tricks. - Charles Burns

1
Cary Bondoc

Basierend auf den Antworten und Kommentaren hier sollte eine Namenskonvention, die die FK-Tabelle, das FK-Feld und die PK-Tabelle (FK_FKTbl_FKCol_PKTbl) enthält, Kollisionen mit FK-Einschränkungen verhindern.

Also für die angegebenen Tabellen hier:

fk_task_userid_user
fk_note_userid_user

Wenn Sie also eine Spalte hinzufügen, um zu verfolgen, wer eine Aufgabe oder eine Notiz zuletzt geändert hat ...

fk_task_modifiedby_user
fk_note_modifiedby_user
0
Chad Kieffer

Verwenden Sie die UUID der Version 4 in Großbuchstaben, wobei das erste Oktett durch FK und '_' (Unterstrich) anstelle von '-' (Bindestrich) ersetzt wird.

Z.B.

  • FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
  • FK_1786_45A6_A17C_F158C0FB343E
  • FK_45A5_4CFA_84B0_E18906927B53

Die Begründung ist die folgende

  • Strenger Generierungsalgorithmus => einheitliche Namen ;
  • Die Schlüssellänge beträgt weniger als 30 Zeichen . Dies ist die Begrenzung der Namenslänge in Oracle (vor 12c).
  • Wenn sich Ihr Entitätsname ändert, müssen Sie Sie müssen Ihren FK nicht umbenennen wie in Entitätsnamen-basierten Ansatz (wenn DB einen Tabellenumbenennungsoperator unterstützt).
  • Man würde selten den Namen der Fremdschlüsseleinschränkung verwenden. Z.B. Das DB-Tool zeigt normalerweise, worauf sich die Einschränkung bezieht. Sie brauchen keine Angst vor kryptischem Aussehen zu haben, da Sie die Verwendung zur "Entschlüsselung" vermeiden können.
0
coldserenity