Efisiensi Kunci Primer Komposit sebagai Kunci Asing

12

Saya punya tabel dengan kunci utama komposit (terdiri dari 4 kolom) yang digunakan untuk memastikan tidak ada duplikat dimasukkan ke dalam tabel. Saya sekarang membutuhkan tabel baru yang perlu merujuk kunci dalam tabel ini sebagai kunci asing.

Pertanyaan saya adalah pendekatan mana yang lebih efisien untuk kecepatan pencarian:

1) Apakah saya membuat tabel baru termasuk semua 4 kolom dan referensi semuanya dalam kunci asing.

atau

2) Apakah saya membuat kolom identitas baru di tabel Kunci Utama dan menggunakan ini sebagai kunci asing di tabel baru.

Basis data ini diharapkan menyimpan jumlah data yang sangat besar, jadi saya telah membangunnya sampai sekarang dengan tujuan untuk meminimalkan jumlah data yang disimpan di setiap tabel. Dengan mengingat hal ini, opsi 2 akan menjadi pendekatan terbaik karena saya akan menyimpan 2 kolom int dan kolom datetime untuk setiap baris, tetapi saya ingin menghindari peningkatan waktu pencarian jika tidak perlu.

aaroncatlin
sumber
1
Saya pribadi hampir selalu akan menggunakan kunci pengganti (misalnya a INT IDENTITY) dalam kasus seperti itu - membuat referensi dan bergabung dengan tabel itu jadi sangat mudah. Untuk menghindari duplikat, berikan batasan UNIK pada empat kolom. Juga: kunci primer sempit jauh lebih baik karena alasan kinerja (jika digunakan sebagai kunci pengelompokan)
marc_s

Jawaban:

11

Biaya menggunakan integer sintetik sederhana PK kecil, dan manfaatnya dalam kasus Anda mungkin cukup besar.

  • Seperti yang Anda tunjukkan, Anda akan memiliki hubungan FK yang lebih sederhana.
  • PK kecil menghasilkan indeks kecil (dan cepat). Total ruang tabel Anda mungkin akan dibuat lebih sedikit dengan menambahkan kolom seperti itu.
  • Jika aturan bisnis berubah, Anda tidak perlu memesan ulang tabel.

Satu-satunya downside materi yang terlintas dalam pikiran adalah bahwa Anda mungkin kehilangan kinerja pada kueri yang diuntungkan dari pengelompokan pada PK komposit. Jika Anda berpikir itu mungkin penting, daripada terus mengelompokkan pada kunci kandidat komposit, tetapi letakkan PK pada kunci sintetis.

Jon dari Semua Perdagangan
sumber
5

Seperti yang sering terjadi di dunia SQL, jawabannya adalah: "Tergantung."

Lihat pertanyaan ini untuk beberapa petunjuk: Apakah kunci alami memberikan kinerja yang lebih tinggi atau lebih rendah dalam SQL Server daripada kunci integer pengganti?

Ada kasus yang melihat peningkatan kinerja saat menggunakan kunci alami sebagai Kunci Asing. Namun, dalam kebanyakan kasus Anda akan lebih baik dengan kunci yang lebih kecil (baca: kunci pengganti).

Jika Anda memperkenalkan kolom IDENTITAS itu, saya bahkan akan menjadikannya Kunci Utama dan mengubah kolom "alami" menjadi CONSTRAINT UNIK.

Sebastian Meine
sumber