Apa yang spesial dari kunci primer?
Apa tujuan dari tabel dalam suatu skema? Apa tujuan dari kunci tabel? Apa yang spesial dari kunci primer? Diskusi seputar kunci primer tampaknya melewatkan poin bahwa kunci utama adalah bagian dari sebuah tabel, dan tabel itu adalah bagian dari skema. Apa yang terbaik untuk hubungan tabel dan tabel harus mendorong kunci yang digunakan.
Tabel (dan hubungan tabel) berisi fakta tentang informasi yang ingin Anda rekam. Fakta-fakta ini harus mandiri, bermakna, mudah dipahami, dan tidak kontradiktif. Dari perspektif desain, tabel lain yang ditambahkan atau dihapus dari skema tidak boleh berdampak pada tabel yang dimaksud. Harus ada tujuan untuk menyimpan data yang terkait hanya dengan informasi itu sendiri. Memahami apa yang disimpan dalam sebuah tabel seharusnya tidak perlu menjalani proyek penelitian ilmiah. Tidak ada fakta yang disimpan untuk tujuan yang sama harus disimpan lebih dari satu kali. Kunci adalah seluruh atau bagian dari informasi yang direkam yang unik, dan kunci primer adalah kunci yang ditunjuk khusus yang menjadi titik akses utama ke tabel (yaitu harus dipilih untuk konsistensi dan penggunaan data, bukan hanya memasukkan kinerja).
- ASIDE: Sayangnya efek samping dari sebagian besar basis data sedang dirancang dan dikembangkan oleh pemrogram aplikasi (yang kadang-kadang saya) adalah bahwa apa yang terbaik untuk aplikasi atau kerangka kerja aplikasi sering mendorong pilihan kunci utama untuk tabel. Ini mengarah ke kunci integer dan GUID (karena ini mudah digunakan untuk kerangka kerja aplikasi) dan desain tabel monolitik (karena ini mengurangi jumlah objek kerangka kerja aplikasi yang diperlukan untuk mewakili data dalam memori). Keputusan desain database yang digerakkan aplikasi ini mengarah pada masalah konsistensi data yang signifikan ketika digunakan pada skala. Kerangka kerja aplikasi yang dirancang dengan cara ini secara alami mengarah ke meja pada suatu waktu desain. "Catatan parsial" dibuat dalam tabel dan data diisi seiring waktu. Interaksi multi-tabel dihindari atau ketika digunakan menyebabkan data tidak konsisten ketika fungsi aplikasi tidak benar. Desain ini mengarah pada data yang tidak berarti (atau sulit dipahami), data tersebar di atas tabel (Anda harus melihat tabel lain untuk memahami tabel saat ini), dan data duplikat.
Dikatakan bahwa kunci primer harus sekecil yang diperlukan. Saya akan mengatakan bahwa kunci harus hanya sebesar yang diperlukan. Menambahkan bidang yang tidak bermakna secara acak ke tabel harus dihindari. Lebih buruk lagi untuk membuat kunci dari bidang yang tidak bermakna yang ditambahkan secara acak, terutama ketika itu menghancurkan ketergantungan gabungan dari tabel lain ke kunci non-primer. Ini hanya masuk akal jika tidak ada kunci kandidat yang baik dalam tabel, tetapi kejadian ini pasti merupakan tanda dari desain skema yang buruk jika digunakan untuk semua tabel.
Juga dikatakan bahwa kunci primer tidak boleh berubah karena memperbarui kunci primer harus selalu keluar dari pertanyaan. Tetapi pembaruan sama dengan hapus diikuti dengan menyisipkan. Dengan logika ini, Anda seharusnya tidak pernah menghapus catatan dari tabel dengan satu kunci dan kemudian menambahkan catatan lain dengan kunci kedua. Menambahkan kunci primer pengganti tidak menghilangkan fakta bahwa kunci lain dalam tabel ada. Memperbarui kunci non-primer dari sebuah tabel dapat menghancurkan makna data jika tabel lain memiliki ketergantungan pada makna tersebut melalui kunci pengganti (misalnya tabel status dengan kunci pengganti yang uraian statusnya diubah dari 'Diproses' menjadi 'Dibatalkan 'Pasti akan merusak data). Apa yang harus selalu keluar dari pertanyaan adalah menghancurkan makna data.
Setelah mengatakan ini, saya berterima kasih atas banyak database yang dirancang dengan buruk yang ada dalam bisnis saat ini (raksasa tak berarti-kunci-data-rusak-1NF), karena itu berarti ada banyak pekerjaan untuk orang-orang yang memahami desain database yang tepat . Tapi di sisi yang menyedihkan, itu kadang-kadang membuatku merasa seperti Sisyphus, tapi aku yakin dia punya satu 401k (sebelum kecelakaan). Jauhi blog dan situs web untuk pertanyaan desain database penting. Jika Anda mendesain database, lihat CJ Date. Anda juga bisa mereferensikan Celko untuk SQL Server, tetapi hanya jika Anda lebih memilih. Di sisi Oracle, rujuk Tom Kyte.