Saya baru mulai bekerja dengan kunci asing untuk pertama kalinya dan saya bertanya-tanya apakah ada skema penamaan standar yang digunakan untuk mereka?
Diberikan tabel ini:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
Di mana Tugas memiliki Catatan, Tugas dimiliki oleh Pengguna, dan Catatan penulis Pengguna.
Bagaimana ketiga kunci asing akan disebutkan dalam situasi ini? Atau sebagai alternatif, apakah itu penting ?
Pembaruan : Pertanyaan ini tentang nama kunci asing, bukan nama bidang!
Jawaban:
Konvensi standar dalam SQL Server adalah:
Jadi, misalnya, kunci antara catatan dan tugas adalah:
Dan kunci antara tugas dan pengguna adalah:
Ini memberi Anda pandangan 'sekilas pandang' dari tabel mana yang terlibat dalam kunci, sehingga membuatnya mudah untuk melihat tabel mana yang satu (yang pertama bernama) tergantung pada (yang kedua bernama). Dalam skenario ini, set kunci lengkap adalah:
Jadi, Anda dapat melihat bahwa tugas bergantung pada pengguna, dan catatan bergantung pada tugas dan pengguna.
sumber
message
tabel memilikifrom_user_id
danto_user_id
keduanya akan menjadifk_message_user
. Menurut saya lebih baik menggunakanfk_tablename_columnname
(fk_message_from_user_id dalam contoh saya) untuk alasan ini dan kemudian mencoba untuk menjaga nama kolom Anda jelas tentang tabel target (yaitu to_user_id jelas merujuk ke tabel pengguna)Saya menggunakan dua karakter garis bawah sebagai pembatas yaitu
Ini karena nama tabel terkadang mengandung karakter garis bawah itu sendiri. Ini mengikuti konvensi penamaan untuk kendala umumnya karena nama elemen data akan sering berisi karakter garis bawah misalnya
sumber
Bagaimana dengan
FK_TABLENAME_COLUMNNAME
?K eep Aku t S imple S tupid bila memungkinkan.
sumber
FK_Animals_OwnerID
—Animal dan Pemilik tabel, didefinisikan pada kolomCatatan dari Microsoft tentang SQL Server:
jadi, saya akan menggunakan istilah yang menggambarkan ketergantungan alih-alih istilah hubungan primer / asing konvensional.
Saat mereferensikan KUNCI UTAMA dari tabel (orang tua) independen dengan kolom dengan nama yang sama di tabel anak (dependen) , saya menghilangkan nama kolom:
Saat mereferensikan kolom lain, atau nama kolom bervariasi antara dua tabel, atau hanya untuk menjadi eksplisit:
sumber
Saya biasanya hanya meninggalkan PK saya bernama id, dan kemudian menyatukan nama tabel dan nama kolom kunci saya ketika menamai FK di tabel lain. Saya tidak pernah repot-repot dengan unta-casing, karena beberapa database membuang sensitivitas huruf dan tetap mengembalikan semua nama huruf besar atau kecil. Bagaimanapun, inilah versi tabel saya yang akan terlihat:
Perhatikan bahwa saya juga memberi nama tabel saya dalam bentuk tunggal, karena satu baris mewakili salah satu objek yang saya tekankan. Banyak dari kebaktian ini adalah pilihan pribadi. Saya menyarankan bahwa lebih penting untuk memilih konvensi dan selalu menggunakannya, daripada mengadopsi konvensi orang lain.
sumber
Ini mungkin over-kill, tetapi ini bekerja untuk saya. Ini sangat membantu saya ketika saya berurusan dengan VLDB khususnya. Saya menggunakan yang berikut ini:
Tentu saja jika karena alasan tertentu Anda tidak mereferensikan kunci utama Anda harus mereferensikan sebuah kolom yang terkandung dalam batasan unik, dalam hal ini:
Bisakah ini panjang, ya. Apakah itu membantu menjaga informasi agar tetap jelas untuk laporan, atau membuat saya lompatan cepat bahwa masalah potensial adalah selama peringatan 100% akan senang untuk mengetahui pikiran orang-orang tentang konvensi penamaan ini.
sumber
Pendekatan saya yang biasa
Atau dengan istilah lain
Dengan cara ini saya bisa memberi nama dua kunci asing yang mereferensikan tabel yang sama seperti
history_info table
dengancolumn actionBy and actionTo
dari dariusers_info
tabelItu akan seperti
Perhatikan bahwa:
Saya tidak memasukkan nama tabel anak karena tampaknya masuk akal bagi saya, saya ada di tabel anak sehingga saya dapat dengan mudah menganggap nama tabel anak itu. Total karakternya adalah 26 dan cocok dengan batas 30 karakter oracle yang dinyatakan oleh Charles Burns pada komentar di sini
sumber
Berdasarkan jawaban dan komentar di sini, konvensi penamaan yang meliputi tabel FK, bidang FK, dan tabel PK (FK_FKTbl_FKCol_PKTbl) harus menghindari tabrakan nama kendala FK.
Jadi, untuk tabel yang diberikan di sini:
Jadi, jika Anda menambahkan kolom untuk melacak siapa yang terakhir memodifikasi tugas atau catatan ...
sumber
Jika Anda tidak mereferensikan FK Anda sesering itu dan menggunakan MySQL (dan InnoDB) maka Anda bisa membiarkan MySQL memberi nama FK untuk Anda.
Di lain waktu Anda dapat menemukan nama FK yang Anda butuhkan dengan menjalankan kueri .
sumber
Coba gunakan UUID Versi 4 yang berhuruf besar dengan oktet pertama diganti oleh FK dan '_' (garis bawah) alih-alih '-' (tanda hubung).
Misalnya
FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
FK_1786_45A6_A17C_F158C0FB343E
FK_45A5_4CFA_84B0_E18906927B53
Dasar pemikirannya adalah sebagai berikut
sumber