Apakah ada manfaat kunci primer yang terdiri dari semua kolom tabel?

17

Saya memiliki tabel dengan empat kolom yang semuanya tidak dapat dibatalkan, dan datanya sedemikian rupa sehingga keempatnya diperlukan untuk membedakan catatan unik. Ini berarti bahwa jika saya membuat kunci utama, itu harus terdiri dari semua kolom. Kueri terhadap tabel hampir selalu untuk menarik kembali satu catatan, yaitu semua kolom akan difilter dalam kueri.

Karena setiap kolom perlu dicari, apakah memiliki kunci utama menguntungkan saya sama sekali (selain menegakkan keunikan catatan)?

goric
sumber

Jawaban:

12

Dalam kasus Anda, bidang-bidang ini alami kunci .

Kunci pengganti:

Kunci pengganti adalah kunci yang tidak memiliki arti "bisnis" dan hanya digunakan untuk mengidentifikasi catatan dalam tabel. Kunci-kunci tersebut dihasilkan dari basis data (contoh: Identity in SQL Server, Sequence in Oracle, Sequence / Identity di DB2 UDB dll.) Atau nilai-nilai sistem yang dihasilkan (seperti yang dihasilkan melalui tabel dalam skema).

Kunci Alami:

Kunci adalah alami jika atribut yang diwakilinya digunakan untuk identifikasi secara independen dari skema basis data. Apa artinya ini pada dasarnya adalah bahwa kuncinya adalah alami jika orang menggunakannya misalnya: Faktur-Angka, Pajak-Id, SSN dll.

Kunci pengganti vs Kunci Alami untuk Kunci Utama

Saya lebih suka menambahkan kunci pengganti untuk model bisnis dan manajemen basis data yang terpisah. Pertanyaan lain adalah menggunakan indeks clustered dan nonclustered pada kunci primer .. Jika tabel Anda berubah (tabel non statis, ia memiliki sisipan atau pembaruan intensif tinggi), Anda akan mendapatkan masalah dengan kinerja jika menggunakan indeks berkerumun pada kunci peningkatan non-monoton.

garik
sumber
2
Saya biasanya memberi tahu orang-orang bahwa mereka harus menggunakan kunci pengganti kecuali mereka ingin menjamin indeks terfragmentasi dan kinerja buruk. Selalu ada pengecualian tetapi sangat, sangat sedikit dalam kasus ini.
AndrewSQL
7

Biasanya disarankan bahwa Anda memiliki kunci pengganti dalam situasi seperti itu, jadi kunci asing di tabel lain (dan referensi catatan apa pun yang dapat disimpan secara eksternal, seperti jika dilakukan pada string kueri di mana permintaan http mengacu pada satu catatan) memiliki sesuatu untuk merujuk yang tidak akan berubah jika data di baris berubah. Jika Anda melakukan ini maka itu akan menjadi kunci utama Anda.

Jika Anda tidak menambahkan kunci pengganti seperti itu, maka diberikan bagaimana Anda menggambarkan data yang diakses memiliki keempat kolom sebagai kunci utama tidak akan merugikan. Jika Anda membuat kunci indeks berkerumun untuk tabel itu akan membantu permintaan seperti itu akan ada satu tingkat di b-tree pada disk untuk turun untuk menemukan data untuk baris yang diberikan.

David Spillett
sumber
0

Jika Anda memiliki tabel yang menunjukkan hubungan banyak-ke-banyak yang hanya memiliki 2 kolom, tampaknya masuk akal.

Lih pertanyaan SO ini

Tapi saya akui, bahwa saya menambahkan Kunci Pengganti bahkan dalam kasus-kasus itu.

bernd_k
sumber