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:
CREATETABLE users(
user_id int,
name varchar(100));CREATETABLE messages(
message_id int,
user_id int
);ALTERTABLE messages ADDCONSTRAINT fk_messages_users_user_id
FOREIGNKEY(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.
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:
CREATETABLE users(
id int,
name varchar(100));CREATETABLE 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).
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'ORDERBY TABLE_NAME;
Misalnya Anda mungkin menerima yang berikut ini dari kueri:
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?
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:
Contoh:
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.
sumber
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 fielduser_id
, karena tabel itu baru disebutuser
, jadi:user_id
dalammessages
tabel adalah bidang fk sehingga harus jelas yang id (user_id
).konvensi penamaan yang sepenuhnya menjelaskan sendiri, menurut saya, bisa jadi:
catatan:
fk ini bisa jadi unik, karena jika
messages_user
ada tabel, nama bidang referensi harususer_id
(dan bukan hanyaid
) 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).
sumber
$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:
Misalnya Anda mungkin menerima yang berikut ini dari kueri:
Jika langkah ekstra ini tidak terlalu banyak untuk Anda, maka Anda seharusnya dapat dengan mudah menemukan fk yang Anda cari.
sumber
Alasannya adalah kombinasi dari
referencing_table
danreferencing_field
unik dalam database. Dengan cara ini agar nama foreign key mudah dibaca, contoh:Jadi kami memiliki dua kunci asing:
Menambahkan
user
nama tabel ke nama kunci asing adalah reduntdant.sumber
user_role
?user
danrole
memiliki banyak hubungan danuser_role
merupakan tabel yang berisi semua kunci asing. Haruskah demikianfk_user_role_role
?