Jawaban:
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.
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?
pilihan saya berbeda. Menurut saya, sebuah tabel harus memiliki id
field, 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_id
dalam messages
tabel 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:
fk ini bisa jadi unik, karena jika messages_user
ada 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).
$id
variabel di suatu tempat tanpa mengetahui tabel mana yang dimilikinya. Semakin tua basis kode Anda dan semakin banyak orang yang mengerjakannya, semakin besar kemungkinannya.
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.
fk-[referencing_table]-[referencing_field]
Alasannya adalah kombinasi dari referencing_table
dan referencing_field
unik 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 user
nama tabel ke nama kunci asing adalah reduntdant.
user_role
? user
dan role
memiliki banyak hubungan dan user_role
merupakan tabel yang berisi semua kunci asing. Haruskah demikian fk_user_role_role
?