wake-up-neo.com

Was ist eine richtige Namenskonvention für MySQL-FKs?

Da sie eindeutig sein müssen, wie sollte ich FKs in einer MySQL-Datenbank nennen?

90
Zombies

In MySQL ist es nicht erforderlich, Fremdschlüsseleinschränkungen einen symbolischen Namen zu geben. Wird kein Name vergeben, erstellt InnoDB automatisch einen eindeutigen Namen.

In jedem Fall ist dies die Konvention, die ich benutze:

fk_[referencing table name]_[referenced table name]_[referencing field name]

Beispiel:

CREATE TABLE users(
    user_id    int,
    name       varchar(100)
);

CREATE TABLE messages(
    message_id int,
    user_id    int
);

ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id 
    FOREIGN KEY (user_id) REFERENCES users(user_id);

Ich versuche, in referenzierenden und referenzierten Tabellen die gleichen Feldnamen zu verwenden wie in user_id im obigen Beispiel. Wenn dies nicht praktikabel ist, füge ich den Namen des referenzierten Felds auch dem Namen des Fremdschlüssels hinzu.

Mit dieser Namenskonvention kann ich den symbolischen Namen nur anhand der Tabellendefinitionen "erraten" und außerdem eindeutige Namen garantieren.

124
Daniel Vassallo

meine Wahl ist anders. Meiner Meinung nach sollte eine Tabelle ein "id" -Feld haben, kein "user_id" -Feld, da die Tabelle nur "user" heißt.

CREATE TABLE users(
   id    int,
   name       varchar(100)
);

CREATE TABLE messages(
   id int,
   user_id    int
);

"user_id" in der "messages" -Tabelle ist ein fk-Feld, daher muss klar sein, welche ID ("user_id") ist.

eine vollständig selbsterklärende Namenskonvention könnte meiner Meinung nach sein:

fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]

i.e.: fk_messages_user_id_users_id 

hinweis:

  • sie können in einigen Fällen das zweite Element weglassen ([referenzierender Feldname])
  • diese fk könnte eindeutig sein, denn wenn eine "messages_user" -Tabelle existiert, sollte der Name des referenzierenden Feldes "user_id" (und nicht nur "id") sein und der fk-Name sollte sein:

    fk_messages_user_user_id_users_id

mit anderen Worten, eine Fremdschlüssel-Namenskonvention stellt sicher, dass Sie eindeutige Namen verwenden, wenn Sie auch eine Namenskonvention "referenzierendes/referenziertes Feld" verwenden (und Sie können natürlich Ihre eigene auswählen).

28
lorenzo

Wenn Sie nicht feststellen, dass Sie nach der Erstellung so oft auf fk verweisen, können Sie dies einfach halten und MySQL die Benennung für Sie vornehmen lassen (als Daniel Vassallo erwähnt am Anfang seiner Antwort ). .

Mit dieser Methode können Sie die Einschränkungsnamen zwar nicht eindeutig "erraten". Sie können den Namen der Fremdschlüssel-Einschränkung jedoch leicht finden, indem Sie eine Abfrage ausführen:

use information_schema;
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME;

Beispielsweise erhalten Sie Folgendes von der Abfrage:

+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note       | taskid      | note_ibfk_2     | task                  | id                     |
| note       | userid      | note_ibfk_1     | user                  | id                     |
| task       | userid      | task_ibfk_1     | user                  | id                     |
+------------+-------------+-----------------+-----------------------+------------------------+

Wenn dieser zusätzliche Schritt nicht zu viel für Sie ist, sollten Sie in der Lage sein, die gesuchte fk leicht zu finden.

8
user12345