Saya memiliki dua tabel:
- Pengguna (nama pengguna, sandi)
- Profil (profileId, gender, dateofbirth, ...)
Saat ini saya menggunakan pendekatan ini: setiap record Profil memiliki field bernama "userId" sebagai kunci asing yang terhubung ke tabel User. Ketika seorang pengguna mendaftar, catatan Profilnya secara otomatis dibuat.
Saya bingung dengan saran teman saya: untuk memiliki "userid" lapangan sebagai asing dan primary key dan menghapus "profileId" lapangan. Pendekatan mana yang lebih baik?
database
foreign-keys
primary-key
Duc Tran
sumber
sumber
Jawaban:
Kunci asing hampir selalu "Izinkan Duplikat", yang akan membuatnya tidak cocok sebagai Kunci Utama.
Sebagai gantinya, temukan bidang yang secara unik mengidentifikasi setiap rekaman dalam tabel, atau tambahkan bidang baru (baik bilangan bulat yang bertambah otomatis atau GUID) untuk bertindak sebagai kunci utama.
Satu-satunya pengecualian untuk ini adalah tabel dengan hubungan satu-ke-satu , di mana kunci asing dan kunci utama dari tabel tertaut adalah satu dan sama.
sumber
Kunci utama selalu harus unik, kunci asing harus mengizinkan nilai non-unik jika tabel adalah hubungan satu-ke-banyak. Tidak masalah menggunakan kunci asing sebagai kunci utama jika tabel dihubungkan dengan hubungan satu-ke-satu, bukan hubungan satu-ke-banyak. Jika Anda ingin catatan pengguna yang sama memiliki kemungkinan memiliki lebih dari 1 catatan profil terkait, gunakan kunci utama terpisah, jika tidak tetap dengan apa yang Anda miliki.
sumber
Ya, itu legal untuk memiliki kunci utama sebagai kunci asing. Ini adalah konstruksi langka, tetapi berlaku untuk:
hubungan 1: 1. Kedua tabel tidak dapat digabungkan menjadi satu karena izin dan hak istimewa yang berbeda hanya berlaku di tingkat tabel (mulai 2017, database seperti itu akan menjadi aneh).
hubungan 1: 0..1. Profil mungkin ada atau mungkin tidak ada, tergantung pada jenis pengguna.
kinerja merupakan masalah, dan desain bertindak sebagai partisi: tabel profil jarang diakses, dihosting pada disk terpisah atau memiliki kebijakan sharding yang berbeda dibandingkan dengan tabel pengguna. Tidak masuk akal jika penyimpanan yang menggarisbawahi berbentuk kolom.
sumber
Secara umum dianggap praktik yang buruk untuk memiliki hubungan satu dengan satu. Ini karena Anda bisa saja membuat data direpresentasikan dalam satu tabel dan mencapai hasil yang sama.
Namun, ada beberapa contoh di mana Anda mungkin tidak dapat membuat perubahan ini ke tabel yang Anda rujuk. Dalam hal ini, tidak ada masalah menggunakan kunci Asing sebagai kunci utama. Mungkin membantu untuk memiliki kunci komposit yang terdiri dari kunci primer unik yang bertambah otomatis dan kunci asing.
Saat ini saya mengerjakan sistem tempat pengguna dapat masuk dan membuat kode pendaftaran untuk digunakan dengan suatu aplikasi. Untuk alasan saya tidak akan membahas, saya tidak dapat menambahkan kolom yang diperlukan ke tabel pengguna. Jadi saya akan menelusuri rute satu ke satu dengan tabel kode.
sumber
Ya, kunci asing bisa menjadi kunci utama dalam kasus hubungan satu ke satu antara tabel tersebut
sumber
Saya tidak akan melakukan itu. Saya akan menyimpan
profileID
sebagai kunci utama tabelProfile
Kunci asing hanyalah batasan referensial antara dua tabel
Orang dapat berargumen bahwa kunci primer diperlukan sebagai target kunci asing yang merujuknya dari tabel lain. Kunci asing adalah sekumpulan satu atau lebih kolom dalam tabel (tidak harus kunci kandidat, apalagi kunci utama, dari tabel itu) yang mungkin menyimpan nilai yang ditemukan di kolom kunci utama dari beberapa meja lainnya. Jadi kita harus memiliki kunci utama untuk mencocokkan kunci asing tersebut. Atau haruskah kita? Satu-satunya tujuan kunci utama dalam pasangan kunci utama / kunci asing adalah untuk memberikan gabungan yang tidak ambigu - untuk menjaga integritas referensial sehubungan dengan tabel "asing" yang menyimpan kunci utama yang direferensikan. Ini memastikan bahwa nilai yang dirujuk kunci asing akan selalu valid (atau null, jika diizinkan).
http://www.aisintl.com/case/primary_and_foreign_key.html
sumber
Itu tergantung bisnis dan sistemnya.
Jika userId Anda unik dan akan selalu unik, Anda dapat menggunakan userId sebagai kunci utama Anda. Tetapi jika Anda ingin memperluas sistem Anda, itu akan mempersulit. Saya menyarankan Anda untuk menambahkan kunci asing di pengguna tabel untuk membuat hubungan dengan profil tabel daripada menambahkan kunci asing di profil tabel.
sumber
Jawaban singkatnya: TERGANTUNG .... Dalam kasus khusus ini, mungkin baik-baik saja. Namun, para ahli akan merekomendasikan untuk tidak melakukannya setiap saat; termasuk kasus Anda.
Mengapa?
Kunci jarang unik dalam tabel ketika mereka asing (berasal dari tabel lain) ke tabel tersebut. Misalnya, ID item mungkin unik dalam tabel ITEMS, tetapi tidak dalam tabel ORDERS, karena jenis item yang sama kemungkinan besar akan ada di pesanan lain. Demikian pula, ID pesanan mungkin unik (mungkin) di tabel ORDERS, tetapi tidak di beberapa tabel lain seperti ORDER_DETAILS tempat pesanan dengan beberapa item baris dapat ada dan untuk membuat kueri terhadap item tertentu dalam pesanan tertentu, Anda memerlukan penggabungan dua FK (order_id dan item_id) sebagai PK untuk tabel ini.
Saya bukan ahli DB, tetapi jika Anda dapat membenarkan secara logis untuk memiliki nilai yang dihasilkan secara otomatis sebagai PK Anda, saya akan melakukannya. Jika ini tidak praktis, maka gabungan dua (atau mungkin lebih) FK bisa menjadi PK Anda. TAPI, saya tidak dapat memikirkan kasus di mana satu nilai FK dapat dibenarkan sebagai PK.
sumber