Tergantung
Ada banyak diskusi yang ada pada pertukaran antara Kunci Alami dan Pengganti - Anda perlu memutuskan apa yang cocok untuk Anda, dan apa 'standar' dalam organisasi Anda.
Dalam kasus OP, ada kedua kunci pengganti (int userId
) dan kunci alami (char
atau varchar username
). Kolom mana pun dapat digunakan sebagai kunci utama untuk tabel, dan dengan cara apa pun, Anda masih dapat menerapkan keunikan kunci lainnya.
Berikut adalah beberapa pertimbangan saat memilih satu atau lain cara:
Kasus untuk menggunakan Kunci Pengganti (mis. UserId INT AUTO_INCREMENT)
Jika Anda menggunakan pengganti, (mis. UserId INT AUTO_INCREMENT
) sebagai Kunci Utama, lalu semua tabel referensi tabel MyUsers
maka harus menggunakan UserId
sebagai Kunci Asing.
Namun Anda masih dapat menerapkan keunikan username
kolom melalui penggunaan indeks unik
tambahan , misalnya:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Sesuai @Dagon, menggunakan kunci primer sempit (seperti int
) memiliki keunggulan kinerja dan penyimpanan dibandingkan menggunakan nilai yang lebih luas (dan panjang variabel) seperti varchar
. Manfaat ini juga memengaruhi tabel lebih lanjut yang mereferensikan MyUsers
, sebagai kunci asing untuk userid
akan lebih sempit (lebih sedikit byte untuk diambil).
Manfaat lain dari kunci integer pengganti adalah bahwa nama pengguna dapat diubah dengan mudah tanpa mempengaruhi tabel referensi MyUsers
.Jika username
digunakan sebagai kunci alami, dan tabel lainnya digabungkan ke MyUsers
melalui username
, sangat merepotkan untuk mengubah nama pengguna (karena hubungan Kunci Asing akan dilanggar). Jika memperbarui nama pengguna diperlukan pada tabel menggunakan username
sebagai kunci asing, teknik seperti ON UPDATE CASCADE
diperlukan untuk mempertahankan integritas data.
Kasus untuk menggunakan Kunci Alami (yaitu nama pengguna)
Satu kelemahan menggunakan Kunci Pengganti adalah tabel lain yang merujuk MyUsers
melalui kunci pengganti harus JOIN
ed kembali ke MyUsers
tabel jika Username
kolom diperlukan. Salah satu manfaat potensial dari kunci Natural adalah jika kueri hanya memerlukan Username
kolom dari tabel yang mereferensikan MyUsers
, yang tidak perlu bergabung kembali ke MyUsers
untuk mengambil nama pengguna, yang akan menghemat beberapa overhead I/O.