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 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:
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).
$idvariabel 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_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.
user_role? userdan rolememiliki banyak hubungan dan user_rolemerupakan tabel yang berisi semua kunci asing. Haruskah demikian fk_user_role_role?