Di tempat kerja kami memiliki basis data besar dengan indeks unik, bukan kunci utama dan semua berfungsi dengan baik.
Saya merancang database baru untuk proyek baru dan saya punya dilema:
Dalam teori DB, kunci utama adalah elemen fundamental, tidak apa-apa, tetapi dalam proyek NYATA apa kelebihan dan kekurangan keduanya?
Apa yang Anda gunakan dalam proyek?
EDIT: ... dan bagaimana dengan kunci primer dan replikasi pada MS SQL server?
sql
database
database-design
Cicik
sumber
sumber
Jawaban:
Apa itu indeks unik?
Indeks unik pada kolom adalah indeks pada kolom itu yang juga memberlakukan batasan bahwa Anda tidak dapat memiliki dua nilai yang sama di kolom itu dalam dua baris yang berbeda. Contoh:
Sisipan terakhir gagal karena melanggar indeks unik pada kolom
foo
ketika mencoba memasukkan nilai 1 ke dalam kolom ini untuk kedua kalinya.Di MySQL, kendala unik memungkinkan banyak NULL.
Dimungkinkan untuk membuat indeks unik pada kolom mutiple.
Kunci utama versus indeks unik
Hal-hal yang sama:
Hal-hal yang berbeda:
sumber
Anda bisa melihatnya seperti ini:
Kunci Utama IS Unik
Nilai unik tidak harus berupa Representasi Elemen
Berarti?; Yah kunci utama digunakan untuk mengidentifikasi elemen, jika Anda memiliki "Orang" Anda ingin memiliki Nomor Identifikasi Pribadi (SSN atau semacamnya) yang merupakan Primer untuk Orang Anda.
Di sisi lain, orang tersebut mungkin memiliki e-mail yang unik, tetapi tidak mengidentifikasi orang tersebut.
Saya selalu memiliki Kunci Utama, bahkan di tabel hubungan (tabel tengah / koneksi) saya mungkin memilikinya. Mengapa? Yah saya suka mengikuti standar ketika coding, jika "Orang" memiliki pengidentifikasi, Mobil memiliki pengenal, well, maka Orang -> Mobil harus memiliki pengidentifikasi juga!
sumber
Kunci asing berfungsi dengan batasan unik serta kunci primer. Dari Buku Online:
Untuk replikasi transaksional, Anda memerlukan kunci utama. Dari Buku Online:
Kedua jawaban untuk SQL Server 2005.
sumber
Pilihan kapan harus menggunakan kunci primer pengganti sebagai pengganti kunci alami itu rumit. Jawaban seperti, selalu atau tidak pernah, jarang bermanfaat. Saya menemukan bahwa itu tergantung pada situasinya.
Sebagai contoh, saya memiliki tabel berikut:
Kami memiliki dua tabel entitas (
toll_booths
dancars
) dan tabel transaksi (drive_through
). Thetoll_booth
meja menggunakan kunci pengganti karena tidak memiliki atribut alam yang tidak dijamin perubahan (nama dapat dengan mudah diubah). Thecars
meja menggunakan kunci utama alami karena memiliki pengenal non-berubah unik (vin
). Itudrive_through
tabel transaksi menggunakan kunci pengganti untuk memudahkan identifikasi, tetapi juga memiliki kendala yang unik pada atribut yang dijamin untuk menjadi unik pada saat catatan dimasukkan.http://database-programmer.blogspot.com memiliki beberapa artikel bagus tentang topik ini.
sumber
Tidak ada kerugian dari kunci primer.
Untuk menambahkan hanya beberapa informasi ke @MrWiggles dan @Peter Parker menjawab, ketika tabel tidak memiliki kunci utama misalnya Anda tidak akan dapat mengedit data dalam beberapa aplikasi (mereka akan berakhir dengan mengatakan bahwa seperti tidak dapat mengedit / menghapus data tanpa kunci utama). Postgresql memungkinkan beberapa nilai NULL berada di kolom UNIK, KUNCI UTAMA tidak mengizinkan NULL. Juga beberapa ORM yang menghasilkan kode mungkin memiliki beberapa masalah dengan tabel tanpa kunci primer.
MEMPERBARUI:
Sejauh yang saya tahu tidak mungkin untuk mereplikasi tabel tanpa kunci primer di MSSQL, setidaknya tanpa masalah ( detail ).
sumber
Jika ada sesuatu yang merupakan kunci utama, tergantung pada mesin DB Anda, seluruh tabel akan diurutkan berdasarkan kunci primer. Ini berarti bahwa pencarian jauh lebih cepat pada kunci utama karena tidak harus melakukan dereferencing karena harus dilakukan dengan jenis indeks lainnya. Selain itu, itu hanya teori.
sumber
Selain apa yang dikatakan jawaban lain, beberapa basis data dan sistem mungkin memerlukan yang utama untuk hadir. Satu situasi muncul di pikiran; ketika menggunakan replikasi perusahaan dengan Informix, seorang PK harus hadir untuk sebuah tabel untuk berpartisipasi dalam replikasi.
sumber
Selama Anda tidak mengizinkan NULL untuk suatu nilai, mereka harus ditangani sama, tetapi nilai NULL ditangani secara berbeda pada basis data (AFAIK MS-SQL tidak mengizinkan lebih dari satu (1) Nilai NULL, mySQL dan Oracle memungkinkan ini , jika sebuah kolom UNIK) Maka Anda harus mendefinisikan kolom ini BUKAN NULL UNIK INDEKS
sumber
Tidak ada yang namanya kunci utama dalam teori data relasional, jadi pertanyaan Anda harus dijawab pada tingkat praktis.
Indeks unik bukan bagian dari standar SQL. Implementasi tertentu dari DBMS akan menentukan apa konsekuensi dari mendeklarasikan indeks unik.
Di Oracle, mendeklarasikan kunci utama akan menghasilkan indeks unik yang dibuat atas nama Anda, jadi pertanyaannya hampir bisa diperdebatkan. Saya tidak bisa memberi tahu Anda tentang produk DBMS lainnya.
Saya lebih suka mendeklarasikan kunci utama. Ini memiliki efek melarang NULL di kolom kunci dan juga melarang duplikat. Saya juga lebih suka menyatakan batasan REFERENSI untuk menegakkan integritas entitas. Dalam banyak kasus, menyatakan indeks pada coulmn (s) kunci asing akan mempercepat bergabung. Jenis indeks ini secara umum tidak boleh unik.
sumber
Ada beberapa kelemahan dari INDEKS BERGERAK vs INDEKS UNIK.
Seperti yang sudah dinyatakan, INDEKS BERKELILINGAN secara fisik memesan data dalam tabel.
Ini berarti bahwa ketika Anda memiliki banyak jika menyisipkan atau menghapus tabel yang berisi indeks berkerumun, setiap kali (well, hampir, tergantung pada faktor pengisian Anda) Anda mengubah data, tabel fisik perlu diperbarui untuk tetap diurutkan.
Dalam tabel yang relatif kecil, ini bagus, tetapi ketika sampai ke tabel yang memiliki nilai data GB, dan memasukkan / menghapus mempengaruhi penyortiran, Anda akan mengalami masalah.
sumber
Saya hampir tidak pernah membuat tabel tanpa kunci primer numerik. Jika ada juga kunci alami yang harus unik, saya juga meletakkan indeks unik di atasnya. Gabungan lebih cepat pada bilangan bulat daripada kunci alam multikolom, data hanya perlu berubah di satu tempat (kunci alami cenderung perlu diperbarui yang merupakan hal buruk ketika berada di kunci primer - hubungan kunci asing). Jika Anda akan membutuhkan replikasi, gunakan GUID alih-alih bilangan bulat, tetapi sebagian besar saya lebih suka kunci yang dapat dibaca pengguna terutama jika mereka perlu melihatnya untuk membedakan antara John Smith dan John Smith.
Beberapa kali saya tidak membuat kunci pengganti adalah ketika saya memiliki tabel bergabung yang terlibat dalam hubungan banyak ke banyak. Dalam hal ini saya menyatakan kedua bidang sebagai kunci utama.
sumber
Pemahaman saya adalah bahwa kunci utama dan indeks unik dengan batasan bukan-nol, adalah sama (*); dan saya kira satu memilih satu atau yang lain tergantung pada apa spesifikasi secara eksplisit menyatakan atau menyiratkan (masalah apa yang ingin Anda ungkapkan dan secara tegas menegakkan). Jika memerlukan keunikan dan bukan-null, maka jadikan itu kunci utama. Jika itu hanya terjadi, semua bagian dari indeks unik tidak-nol tanpa persyaratan untuk itu, maka buat saja itu indeks unik.
Satu-satunya perbedaan yang tersisa adalah, Anda mungkin memiliki beberapa indeks unik bukan nol, sementara Anda tidak dapat memiliki beberapa kunci utama.
(*) Kecuali perbedaan praktis: kunci primer dapat menjadi kunci unik default untuk beberapa operasi, seperti mendefinisikan kunci asing. Ex. jika seseorang mendefinisikan kunci asing yang merujuk pada tabel dan tidak memberikan nama kolom, jika tabel yang direferensikan memiliki kunci utama, maka kunci utama akan menjadi kolom yang direferensikan. Kalau tidak, kolom yang direferensikan harus diberi nama secara eksplisit.
Yang lain di sini menyebutkan replikasi DB, tapi saya tidak tahu.
sumber
Indeks Unik dapat memiliki satu nilai NULL. Ini menciptakan INDEKS NON-CLUSTERED. Kunci Utama tidak boleh berisi nilai NULL. Ini menciptakan INDEKS BERKELAS.
sumber
Dalam MSSQL, kunci primer harus meningkat secara monoton untuk kinerja terbaik pada indeks berkerumun. Oleh karena itu bilangan bulat dengan penyisipan identitas lebih baik daripada kunci alami yang mungkin tidak meningkat secara monoton.
sumber
Jika itu terserah saya ...
Anda harus memenuhi persyaratan database dan aplikasi Anda.
Menambahkan bilangan bulat penambahan otomatis atau kolom id panjang ke setiap tabel untuk berfungsi sebagai kunci utama menangani persyaratan basis data.
Anda kemudian akan menambahkan setidaknya satu indeks unik lainnya ke tabel untuk digunakan oleh aplikasi Anda. Ini akan menjadi indeks pada employee_id, atau account_id, atau customer_id, dll. Jika memungkinkan, indeks ini tidak boleh menjadi indeks komposit.
Saya lebih suka indeks pada beberapa bidang secara individual daripada indeks komposit. Basis data akan menggunakan indeks bidang tunggal setiap kali klausa mana menyertakan bidang itu, tetapi hanya akan menggunakan komposit saat Anda memberikan bidang dalam urutan yang benar - artinya itu tidak dapat menggunakan bidang kedua dalam indeks komposit kecuali jika Anda memberikan baik yang pertama dan kedua di mana Anda klausa.
Saya semua menggunakan indeks tipe Fungsi yang dihitung atau - dan akan merekomendasikan menggunakannya lebih dari indeks komposit. Itu membuatnya sangat mudah untuk menggunakan indeks fungsi dengan menggunakan fungsi yang sama di klausa tempat Anda.
Ini menangani persyaratan aplikasi Anda.
Sangat mungkin bahwa indeks non-primer lainnya sebenarnya memetakan nilai kunci indeks itu ke nilai kunci primer, bukan rowid (). Ini memungkinkan operasi penyortiran fisik dan penghapusan terjadi tanpa harus membuat ulang indeks ini.
sumber