Apa konvensi penamaan yang tepat untuk MySQL FK?

Jawaban:

141

Di MySQL, tidak perlu memberikan nama simbolis untuk batasan kunci asing. Jika nama tidak diberikan, InnoDB membuat nama unik secara otomatis.

Bagaimanapun, ini adalah konvensi yang saya gunakan:

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

Contoh:

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);

Saya mencoba untuk tetap menggunakan nama bidang yang sama dalam tabel referensi dan referensi, seperti pada user_id contoh di atas. Jika ini tidak praktis, saya juga menambahkan nama bidang yang direferensikan ke nama kunci asing.

Konvensi penamaan ini memungkinkan saya untuk "menebak" nama simbolik hanya dengan melihat definisi tabel, dan sebagai tambahan, ini juga menjamin nama yang unik.

Daniel Vassallo
sumber
13
Alasan membuat nama simbolik adalah untuk referensi saat Anda ingin / perlu melepaskan batasan. Oracle & SQL Server memungkinkan Anda untuk menonaktifkan batasan tertentu. Jika Anda tidak memiliki fk dalam nama, Anda harus mengonfirmasi bahwa batasannya adalah batasan kunci asing ...
OMG Ponies
11
Yang ingin saya lakukan adalah menggunakan garis bawah ganda antara nama tabel referensi dan nama tabel yang direferensikan. Ini memberi Anda keuntungan ganda dari daftar alfabet yang menjaga semua FK tabel bersama-sama dan pada saat yang sama membantu Anda menghindari benturan / kebingungan nama saat ada beberapa nama tabel kata. Saya juga menghilangkan bagian bidang dari nama ketika itu sepele (yaitu satu bidang int mereferensikan identitas PK dari tabel lain).
Joel Brown
2
Bagaimana jika ada lebih dari 1 kunci asing? Contoh: member_id~> link ke anggota tabel, edited_id~> foreign key untuk pengguna yang diedit, juga link ke anggota tabel. Bagaimana saya harus memberi nama mereka?
TomSawyer
@TomSawyer: Saya menambahkan 'pk_' ke semua kunci asing, diikuti dengan tabel yang direferensikan (misalnya 'anggota'), diikuti dengan penggunaan / pengertian (misalnya 'editor' atau 'penulis'). Jadi saya punya sesuatu seperti 'pk_members_author' atau 'pk_members_editor'.
Nrgyzer
28

pilihan saya berbeda. Menurut saya, sebuah tabel harus memiliki idfield, bukan field user_id, karena tabel itu baru disebut user, jadi:

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

CREATE TABLE messages(
   id int,
   user_id    int
);

user_iddalam messagestabel adalah bidang fk sehingga harus jelas yang id ( user_id).

konvensi penamaan yang sepenuhnya menjelaskan sendiri, menurut saya, bisa jadi:

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

i.e.: `fk_messages_user_id_users_id`

catatan:

  • Anda dapat, dalam beberapa kasus, menghilangkan elemen kedua ([referensi nama bidang])
  • fk ini bisa jadi unik, karena jika messages_userada tabel, nama bidang referensi harus user_id(dan bukan hanya id) dan nama fk harus:

    fk_messages_user_user_id_users_id

dengan kata lain, konvensi penamaan kunci asing memastikan Anda tentang nama unik jika Anda juga menggunakan konvensi penamaan "bidang referensi / referensi" (dan Anda dapat memilih sendiri, tentunya).

lorenzo
sumber
4
Nama memiliki cara untuk bertahan di seluruh kode. Akhirnya, Anda akan menemukan $idvariabel di suatu tempat tanpa mengetahui tabel mana yang dimilikinya. Semakin tua basis kode Anda dan semakin banyak orang yang mengerjakannya, semakin besar kemungkinannya.
CJ Dennis
9

Jika Anda tidak menemukan diri Anda mereferensikan fk yang sering setelah dibuat, salah satu opsi adalah membuatnya tetap sederhana dan membiarkan MySQL melakukan penamaan untuk Anda (seperti yang disebutkan Daniel Vassallo di awal jawabannya ).

Meskipun Anda tidak dapat secara unik "menebak" nama batasan dengan metode ini - Anda dapat dengan mudah menemukan nama batasan kunci asing dengan menjalankan kueri:

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;

Misalnya Anda mungkin menerima yang berikut ini dari kueri:

+------------+-------------+-----------------+-----------------------+------------------------+
| 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                     |
+------------+-------------+-----------------+-----------------------+------------------------+

Jika langkah ekstra ini tidak terlalu banyak untuk Anda, maka Anda seharusnya dapat dengan mudah menemukan fk yang Anda cari.

pengguna12345
sumber
1
fk-[referencing_table]-[referencing_field]

Alasannya adalah kombinasi dari referencing_tabledan referencing_fieldunik dalam database. Dengan cara ini agar nama foreign key mudah dibaca, contoh:

table `user`:
    id
    name
    role

table `article`:
    id
    content
    created_user_id /* --> user.id */
    reviewed_user_id /* --> user.id */

Jadi kami memiliki dua kunci asing:

fk-article-created_user_id
fk-article-reviewed_user_id

Menambahkan usernama tabel ke nama kunci asing adalah reduntdant.

Văn Quyết
sumber
Bagaimana jika nama database adalah user_role? userdan rolememiliki banyak hubungan dan user_rolemerupakan tabel yang berisi semua kunci asing. Haruskah demikian fk_user_role_role?
Nguyễn Đức Tâm
@ NguyễnĐứcTâm fk-user_role-role
Văn Quyết