Pertanyaan ini muncul setelah membaca komentar dalam pertanyaan ini:
Saat Anda membuat tabel banyak-ke-banyak, jika Anda membuat kunci utama komposit pada dua kolom kunci asing, atau membuat kunci utama "ID" pengganti auto-increment, dan hanya meletakkan indeks pada dua kolom FK Anda (dan mungkin kendala unik)? Apa implikasi pada kinerja untuk memasukkan catatan baru / pengindeksan ulang di setiap kasus?
Pada dasarnya, ini:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
vs. ini:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Pemberi komentar mengatakan:
membuat dua ID PK berarti tabel secara fisik diurutkan pada disk dalam urutan itu. Jadi jika kita memasukkan (Part1 / Device1), (Part1 / Device2), (Part2 / Device3), maka (Part 1 / Device3) database harus memecah tabel dan memasukkan yang terakhir antara entri 2 dan 3. Untuk banyak rekaman, ini menjadi sangat bermasalah karena melibatkan pengacakan ratusan, ribuan, atau jutaan rekaman setiap kali satu ditambahkan. Sebaliknya, PK yang mengalami peningkatan otomatis memungkinkan rekaman baru ditempelkan sampai akhir.
Alasan saya bertanya adalah karena saya selalu cenderung melakukan kunci utama komposit tanpa kolom kenaikan otomatis pengganti, tetapi saya tidak yakin apakah kunci pengganti sebenarnya lebih berkinerja.
sumber
Jawaban:
Dengan pemetaan banyak-ke-banyak dua kolom yang sederhana, saya melihat tidak ada keuntungan nyata memiliki kunci pengganti. Memiliki kunci utama pada
(col1,col2)
dijamin unik (dengan asumsi nilaicol1
dan Andacol2
dalam tabel yang direferensikan unik) dan indeks terpisah pada(col2,col1)
akan menangkap kasus-kasus di mana urutan sebaliknya akan dieksekusi lebih cepat. Pengganti adalah pemborosan ruang.Anda tidak perlu indeks pada kolom individual karena tabel hanya boleh digunakan untuk menggabungkan dua tabel yang direferensikan bersama.
Komentar yang Anda maksud dalam pertanyaan tidak sebanding dengan elektron yang digunakannya, menurut pendapat saya. Sepertinya penulis menganggap tabel disimpan dalam array daripada struktur pohon multi-arah yang seimbang dengan kinerja yang sangat tinggi.
Sebagai permulaan, tidak perlu menyimpan atau mendapatkan tabel yang diurutkan, cukup indeksnya. Dan indeks tidak akan disimpan secara berurutan, itu akan disimpan dengan cara yang efisien agar dapat diambil dengan cepat.
Selain itu, sebagian besar tabel database jauh lebih sering dibaca daripada ditulis. Itu membuat apa pun yang Anda lakukan di sisi pilih jauh lebih relevan daripada apa pun di sisi sisipan.
sumber
insert
akan menjadi masalah jika dilakukan ribuan kali per jam. Anda tidak bisa mengabaikannya begitu saja hanya karena rasioinsert
toselect
adalah <1. Dalam hal ini, pelanggan peduli tentang berapa banyak waktu yang dibutuhkan untuk melakukan pemesanan.Tidak ada kunci pengganti yang diperlukan untuk tabel tautan.
Satu PK di (col1, col2) dan indeks unik lainnya di (col2, col1) adalah semua yang Anda butuhkan
Kecuali Anda menggunakan ORM yang tidak dapat mengatasi dan menentukan desain DB Anda untuk Anda ...
Edit: Saya menjawab hal yang sama di sini: SQL: Apakah Anda memerlukan kunci primer inkremental otomatis untuk tabel Banyak-Banyak?
sumber
(col2, col1)
tidak(col1, col2)
. PK dari(col1, col2)
mungkin tidak cocok untuk semua kueri dan menghasilkan pemindaian, jadi memiliki kebalikannya meningkatkan kinerja karena memungkinkan pencarian di mana col2 lebih baik. Misalnya, validasi FK ketika tabel dengan col2 memiliki penghapusan. Meja anak smuts diperiksaKunci utama inkremental mungkin diperlukan jika tabel direferensikan. Mungkin ada detail dalam tabel banyak ke banyak yang perlu ditarik dari tabel lain menggunakan kunci primer inkremental.
sebagai contoh
Sangat mudah untuk menarik 'Detail Lainnya' menggunakan PartDevice.ID sebagai FK. Oleh karena itu penggunaan kunci primer inkremental diperlukan.
sumber
Cara terpendek dan paling langsung saya dapat menjawab pertanyaan Anda adalah dengan mengatakan bahwa akan ada dampak kinerja jika dua tabel yang Anda tautkan tidak memiliki kunci primer berurutan. Seperti yang Anda nyatakan / kutip, indeks untuk tabel tautan akan menjadi terfragmentasi, atau DBMS akan bekerja lebih keras untuk menyisipkan rekaman jika tabel tautan tidak memiliki kunci primer berurutannya sendiri. Inilah alasan kebanyakan orang meletakkan kunci utama yang bertambah secara berurutan pada tabel tautan.
sumber
Jadi sepertinya jika tugas HANYA adalah menghubungkan dua tabel, PK terbaik adalah PK kolom ganda.
Tetapi jika itu melayani tujuan lain, tambahkan NDX lain sebagai PK dengan kunci asing dan indeks unik kedua.
Indeks atau PK adalah cara terbaik untuk memastikan tidak ada duplikat. PK memungkinkan alat seperti Microsoft Management Studio melakukan beberapa pekerjaan (membuat tampilan) untuk Anda
sumber