Saya tidak melihat jawaban yang menunjukkan (apa yang saya anggap) poin yang sangat mendasar - yaitu, kunci utama adalah yang menjamin bahwa Anda tidak akan mendapatkan dua entri dalam tabel untuk entitas dunia nyata yang sama (seperti dimodelkan dalam database). Pengamatan ini membantu menetapkan apa yang baik dan apa pilihan buruk untuk kunci utama.
Misalnya, dalam tabel nama dan kode negara bagian (AS), nama atau kode tersebut dapat menjadi kunci utama - keduanya merupakan dua kunci kandidat yang berbeda, dan salah satunya (biasanya kode yang lebih pendek) dipilih sebagai kunci utama. Dalam teori dependensi fungsional (dan menggabungkan dependensi - 1NF hingga 5NF - kunci kandidatlah yang lebih penting daripada kunci primer.
Sebagai contoh tandingan, nama manusia umumnya membuat pilihan kunci primer yang buruk. Ada banyak orang yang menggunakan nama "John Smith" atau nama lain yang serupa; bahkan dengan mempertimbangkan nama tengah (ingat: tidak semua orang memilikinya - misalnya, saya tidak), ada banyak ruang untuk duplikasi. Akibatnya, orang tidak menggunakan nama sebagai kunci utama. Mereka menemukan kunci buatan seperti Nomor Jaminan Sosial (SSN) atau Nomor Karyawan dan menggunakannya untuk menunjuk individu.
Kunci utama yang ideal adalah yang pendek, unik, mudah diingat, dan alami. Dari ciri-ciri ini, keunikan adalah wajib; sisanya harus fleksibel karena kendala data dunia nyata.
Oleh karena itu, ketika menentukan kunci utama dari tabel tertentu, Anda harus melihat apa yang diwakili tabel itu. Kumpulan atau kumpulan nilai kolom apa dalam tabel yang secara unik mengidentifikasi setiap baris dalam tabel? Itu adalah kunci kandidat. Sekarang, jika setiap kunci kandidat terdiri dari 4 atau 5 kolom, maka Anda mungkin memutuskan bahwa kunci-kunci tersebut terlalu kaku untuk membuat kunci utama yang baik (terutama karena alasan singkatnya). Dalam keadaan seperti itu, Anda mungkin memperkenalkan kunci pengganti - angka yang dibuat secara artifisial. Sangat sering (tetapi tidak selalu) integer 32-bit sederhana cukup untuk kunci pengganti. Anda kemudian menetapkan kunci pengganti ini sebagai kunci utama.
Namun, Anda masih harus memastikan bahwa kunci kandidat lainnya (untuk kunci pengganti juga merupakan kunci kandidat, serta kunci utama yang dipilih) semuanya dipertahankan sebagai pengenal unik - biasanya dengan menempatkan batasan unik pada kumpulan kolom tersebut.
Kadang-kadang, orang merasa sulit untuk mengidentifikasi apa yang membuat baris unik, tetapi harus ada sesuatu untuk dilakukan, karena hanya mengulangi sepotong informasi tidak membuatnya menjadi lebih benar. Dan jika Anda tidak berhati-hati dan mendapatkan dua (atau lebih) baris yang dimaksudkan untuk menyimpan informasi yang sama, dan Anda kemudian perlu memperbarui informasi, ada bahaya (terutama jika Anda menggunakan kursor) bahwa Anda hanya akan memperbarui satu baris daripada setiap baris, sehingga baris tidak sinkron dan tidak ada yang tahu baris mana yang berisi informasi yang benar.
Ini adalah pandangan garis yang cukup keras, dalam beberapa hal.
Saya tidak memiliki masalah khusus dengan menggunakan GUID saat dibutuhkan, tetapi cenderung besar (seperti pada 16-64 byte), dan terlalu sering digunakan. Seringkali nilai 4-byte yang sangat baik sudah cukup. Menggunakan GUID di mana nilai 4-byte akan cukup menghabiskan ruang disk, dan bahkan memperlambat akses yang diindeks ke data karena ada lebih sedikit nilai per halaman indeks, sehingga indeks akan menjadi lebih dalam dan lebih banyak halaman harus dibaca untuk sampai ke informasi.