Haruskah setiap tabel memiliki kunci utama?

341

Saya membuat tabel database dan saya tidak memiliki kunci primer logis yang ditugaskan untuk itu. Jadi, saya berpikir untuk meninggalkannya tanpa kunci utama, tetapi saya merasa sedikit bersalah tentang itu. Haruskah saya?

Haruskah setiap tabel memiliki kunci utama?

Daniel Silveira
sumber
5
Bisakah Anda memberikan lebih banyak detail tentang tabel? Jawabannya mungkin "ya".
Ryan Bair
7
Ya, setiap tabel harus memiliki kunci utama.
Syed Tayyab Ali

Jawaban:

314

Jawaban singkat: ya .

Jawaban panjang:

  • Anda perlu meja Anda agar dapat digabung dengan sesuatu
  • Jika Anda ingin meja Anda dikelompokkan, Anda memerlukan semacam kunci utama.
  • Jika desain meja Anda tidak memerlukan kunci utama, pikirkan kembali desain Anda: kemungkinan besar, Anda kehilangan sesuatu. Mengapa menyimpan catatan yang identik?

Di MySQL, mesin penyimpanan InnoDB selalu membuat kunci utama jika Anda tidak menentukannya secara eksplisit, sehingga membuat kolom tambahan yang tidak dapat Anda akses.

Perhatikan bahwa kunci utama dapat berupa komposit.

Jika Anda memiliki tabel tautan banyak ke banyak, Anda membuat kunci utama pada semua bidang yang terlibat dalam tautan. Dengan demikian Anda memastikan bahwa Anda tidak memiliki dua atau lebih catatan yang menggambarkan satu tautan.

Selain masalah konsistensi logis, sebagian besar mesin RDBMS akan mendapat manfaat dari memasukkan bidang ini dalam indeks unik.

Dan karena kunci utama apa pun melibatkan pembuatan indeks unik, Anda harus mendeklarasikannya dan mendapatkan konsistensi dan kinerja logis.

Lihat artikel ini di blog saya untuk alasan mengapa Anda harus selalu membuat indeks unik pada data unik:

PS Ada beberapa kasus yang sangat, sangat istimewa di mana Anda tidak memerlukan kunci primer.

Sebagian besar mereka menyertakan tabel log yang tidak memiliki indeks apa pun karena alasan kinerja.

Quassnoi
sumber
mereka masih memiliki kunci utama, satu komposit
kristof
2
@annakata: mereka harus memiliki kunci primer komposit
Quassnoi
1
"Dan karena KUNCI UTAMA melibatkan pembuatan indeks UNIK" tidak benar untuk Oracle. Satu dapat menggunakan indeks non-unik untuk menegakkan kunci utama. Bahkan, kadang-kadang DIBUTUHKAN bahwa batasan unik dan PK menggunakan indeks tidak unik.
Stephanie Halaman
3
Hanya komentar pada pertanyaan retoris "Mengapa menyimpan catatan identik?". Perhatikan bahwa hanya menambahkan PK tidak akan memastikan bahwa tidak ada duplikasi. Seringkali PK tidak terlihat oleh pengguna, maka yang penting adalah di bidang yang terlihat, yang dapat berisi data duplikat. Tergantung pada desain Anda, ini mungkin diinginkan atau tidak.
Rossco
1
Kunci tidak ada hubungannya dengan kebersamaan. Dan argumen pengelompokan tergantung pada DBMS yang Anda gunakan, dan mencampur pertimbangan logis dan fisik.
Jon Heggland
36

Selalu yang terbaik untuk memiliki kunci utama. Dengan cara ini memenuhi bentuk normal pertama dan memungkinkan Anda untuk melanjutkan sepanjang jalur normalisasi database .

Seperti yang dinyatakan oleh orang lain, ada beberapa alasan untuk tidak memiliki kunci primer, tetapi sebagian besar tidak akan dirugikan jika ada kunci primer

Michael Wheeler
sumber
5
@PaulSuart Data tidak harus selalu dalam bentuk normal. Bahkan, ketika data menjadi besar, itu tidak boleh disimpan dalam bentuk normal karena jika tidak mengakses data akan sangat lambat untuk permintaan melakukan tabel bergabung dll besar sekali
Pacerier
13

Hampir setiap saat saya membuat tabel tanpa kunci primer, berpikir saya tidak akan membutuhkannya, saya akhirnya kembali dan menambahkannya. Saya sekarang membuat bahkan tabel gabung saya dengan bidang identitas yang dibuat secara otomatis yang saya gunakan sebagai kunci utama.

tvanfosson
sumber
13
Tabel gabungan ADALAH kunci utama - gabungan, terdiri dari PK dari kedua catatan yang bergabung. Misalnya CREATE TABLE PersonOrder (PersonId int, OrderId int, PRIMARY KEY (PersonId, OrderId)).
Keith Williams
3
Ya, tetapi bagaimana jika Tabel Tautan juga memiliki atribut ketiga, katakanlah "OrderDate". Apakah Anda akan menambahkannya ke kunci komposit juga? IMHO tidak - karena lebih lanjut dapat direduksi dan tidak melayani karakter kunci yang tidak dapat direduksi, kunci primer seharusnya.
stevek
13

Kecuali untuk beberapa kasus yang sangat jarang (mungkin tabel hubungan banyak-ke-banyak, atau tabel yang sementara Anda gunakan untuk memuat banyak data dalam jumlah besar), saya akan mengatakan:

Jika tidak memiliki kunci utama, itu bukan meja!

Marc

marc_s
sumber
10
Sebenarnya kalimat itu salah. Tabel dapat berupa "Lihat Tabel" yang dibuat oleh Bahasa Query Anda. RDBMS terdiri dari relasi bukan tabel. Kalimat itu seharusnya mengatakan: "Jika tidak memiliki kunci utama, itu bukan hubungan!".
stevek
Atau mungkin, "jika tidak ada kunci kandidat maka itu bukan tabel relasional". Tapi lihat kasus yang sangat jarang terjadi di mana boleh saja memiliki tabel yang tidak mewakili relasi.
Walter Mitty
Mengapa tabel banyak-ke-banyak tidak memiliki kunci utama? Anda bisa membuat kunci primer terpisah dan kemudian membuat indeks unik untuk pengganti kunci asing. Saya pikir lebih baik memiliki kunci utama di setiap tabel. Bahkan pada tabel pemuatan massal, Anda mungkin ingin secara terpisah mengidentifikasi kunci utama yang tidak termasuk data yang diimpor karena dapat membantu Anda mengidentifikasi catatan duplikat dalam proses ETL. Tampak bagi saya bahwa setiap tabel masih harus memiliki kunci utama, bahkan jika itu sedikit lebih banyak penyimpanan. Tabel yang dibuat oleh tampilan adalah bagian dari tabel bukan tabel itu sendiri.
John Ernest
1
Dalam tabel hubungan banyak ke banyak, Anda bisa membuat kunci primer komposit yang terdiri dari kedua id untuk hubungan.
Jaap
8

Cukup tambahkan, Anda akan menyesal nanti ketika tidak melakukannya (memilih, menghapus. Menautkan, dll)

raphaëλ
sumber
8

Apakah Anda perlu bergabung dengan tabel ini ke tabel lain? Apakah Anda memerlukan cara untuk mengidentifikasi catatan secara unik? Jika jawabannya ya, Anda perlu kunci utama. Anggap data Anda seperti tabel pelanggan yang memiliki nama-nama orang yang menjadi pelanggan. Mungkin tidak ada kunci alami karena Anda memerlukan alamat, email, nomor telepon, dll. Untuk menentukan apakah Sally Smith ini berbeda dari Sally Smith dan Anda akan menyimpan informasi itu dalam tabel terkait karena orang tersebut dapat memiliki telepon mulitple, addesses , email, dll. Misalkan Sally Smith menikahi John Jones dan menjadi Sally Jones. Jika Anda tidak memiliki kunci buatan di atas meja, saat memperbarui nama, Anda baru saja mengubah 7 Sally Smiths menjadi Sally Jones meskipun hanya satu dari mereka yang menikah dan mengubah namanya.

Anda mengatakan Anda tidak memiliki kunci alami, oleh karena itu Anda tidak memiliki kombinasi bidang untuk membuat unik juga, ini membuat kunci artfisial kritis.

Saya telah menemukan kapan saja saya tidak memiliki kunci alami, kunci buatan adalah keharusan mutlak untuk menjaga integritas data. Jika Anda memiliki kunci alami, Anda dapat menggunakannya sebagai bidang kunci. Tetapi secara pribadi kecuali kunci natural adalah satu bidang, saya masih lebih suka kunci artifisial dan indeks unik pada kunci alami. Anda akan menyesal nanti jika Anda tidak memasukkannya.

HLGEM
sumber
6

Ini adalah praktik yang baik untuk memiliki PK di setiap meja, tetapi itu bukan HARUS. Kemungkinan besar Anda akan memerlukan indeks unik, dan / atau indeks berkerumun (yang PK atau tidak) tergantung pada kebutuhan Anda.

Lihat bagian Primary Key dan Indexed Clustered pada Books Online (untuk SQL Server)

" Batasan KUNCI UTAMA mengidentifikasi kolom atau kumpulan kolom yang memiliki nilai yang secara unik mengidentifikasi baris dalam tabel. Tidak ada dua baris dalam tabel yang dapat memiliki nilai kunci utama yang sama. Anda tidak dapat memasukkan NULL untuk kolom apa pun di kunci utama. Kami merekomendasikan menggunakan kolom integer kecil sebagai kunci utama. Setiap tabel harus memiliki kunci primer. Kolom atau kombinasi kolom yang memenuhi syarat sebagai nilai kunci primer disebut sebagai kunci kandidat. "

Tetapi kemudian periksa juga: http://www.aisintl.com/case/primary_and_foreign_key.html

endo64
sumber
4
Halaman itu cukup bodoh. Pertama, kunci utama diperlukan untuk alasan kinerja. Dengan membaca halamannya, saya belajar bahwa menambahkan ID ke tabel buku tidak berguna karena teks buku itu unik; jelas, pria itu tidak pernah bekerja dengan database. Tapi dia juga memiliki masalah dalam memahami apa yang dia kritik. Halaman menulis bahwa 1) nilai PK merujuk pada baris 2) Anda dapat bergabung dengan 2 tabel dengan set kolom apa pun. Tidak ada kontradiksi. Sungguh menakjubkan bahwa seorang penulis artikel akademis tidak memahami dasar teori relasional.
Federico Razzoli
1
"Pertama, kunci utama diperlukan untuk alasan kinerja" ini tidak benar, PK tidak secara langsung mempengaruhi kinerja. Tidak memiliki PK dapat menyebabkan banyak masalah (mengidentifikasi baris, bergabung, dll.) Tetapi kinerjanya bukan salah satunya. Ketika Anda membuat PK di atas meja SQL server membuat indeks berkerumun unik, indeks yang memengaruhi kinerja bukan PK itu sendiri. Sebagai contoh nyata, tabel saya memiliki indeks berkerumun di kolom tanggal dan PK di bidang GUID, karena baris saya harus dipesan secara fisik di atas kolom tanggal di tabel karena semua kueri memiliki rentang tanggal (dalam kasus saya).
endo64
Itu indeks berkerumun adalah rasa kunci utama, dibuat oleh SQL Server dan beberapa DBMS lainnya. Apakah Anda yakin itu ide yang baik untuk menggunakannya? Sebagai contoh, di MySQL, itu bukan karena beberapa alasan tidak berdokumen.
Federico Razzoli
1
Perlu diingat bahwa GUID bukan tipe yang optimal untuk PK, di InnoDB. Semua indeks berisi referensi ke PK jadi, semakin besar PK, semakin besar semua indeks lainnya.
Federico Razzoli
6

Tidak setuju dengan jawaban yang disarankan. Jawaban singkatnya adalah: TIDAK .

Tujuan dari kunci utama adalah untuk mengidentifikasi secara unik baris di atas meja untuk membentuk hubungan dengan tabel lain. Secara tradisional, nilai integer yang ditambahkan secara otomatis digunakan untuk tujuan ini, tetapi ada variasi untuk ini.

Namun ada beberapa kasus, misalnya mencatat data seri waktu, di mana keberadaan kunci semacam itu sama sekali tidak diperlukan dan hanya menghabiskan memori. Membuat baris yang unik tidak perlu ...!

Contoh kecil: Tabel A: LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

Tidak diperlukan Kunci Primer.

Tabel B: Pengguna

Columns: Id, FirstName, LastName etc. 

Kunci Utama (Id) diperlukan agar dapat digunakan sebagai "kunci asing" ke tabel LogData.

Theodore Zographos
sumber
3

Saya tahu bahwa untuk menggunakan fitur-fitur tertentu dari gridview di .NET, Anda memerlukan kunci utama agar gridview mengetahui baris mana yang perlu diperbarui / dihapus. Praktik umum harus memiliki kunci primer atau kluster kunci primer. Saya pribadi lebih suka yang pertama.

Tacoman667
sumber
3

Untuk membuatnya menjadi bukti di masa depan, Anda harus melakukannya. Jika Anda ingin meniru, Anda memerlukannya. Jika Anda ingin bergabung ke meja lain hidup Anda (dan orang-orang bodoh yang harus mempertahankannya tahun depan) akan jauh lebih mudah.

StewNoble
sumber
Saya belum yakin itu perlu, tetapi "lakukan karena kalau tidak ada orang yang harus berurusan dengan konsekuensinya nanti" sudah cukup untuk membuat saya berbuat salah di sisi melakukannya. Saya selalu bisa saja
meletakkan
3

Saya berperan menjaga aplikasi yang dibuat oleh tim pengembangan luar negeri. Sekarang saya memiliki semua jenis masalah dalam aplikasi karena skema database asli tidak mengandung tombol utama pada beberapa tabel. Jadi tolong jangan biarkan orang lain menderita karena desain Anda yang buruk. Itu selalu ide yang baik untuk memiliki kunci utama di atas meja.

Siwa
sumber
2

Saya selalu memiliki kunci utama, bahkan jika pada awalnya saya belum memiliki tujuan untuk itu. Ada beberapa kali ketika saya akhirnya membutuhkan PK di meja yang tidak memiliki PK dan selalu lebih sulit untuk memasukkannya nanti. Saya pikir ada lebih banyak sisi positif untuk selalu menyertakan satu.

rvarcher
sumber
1

Singkatnya, tidak. Namun, Anda harus ingat bahwa klien tertentu dapat mengakses operasi CRUD. Untuk pemeriksaan di masa depan, saya cenderung selalu menggunakan kunci utama.

Rich.Carpenter
sumber
1

Jika Anda menggunakan Hibernasi, itu tidak mungkin untuk membuat Entitas tanpa kunci utama. Masalah ini dapat menimbulkan masalah jika Anda bekerja dengan database yang sudah ada yang dibuat dengan skrip sql / ddl biasa, dan tidak ada kunci primer yang ditambahkan

Schildmeijer
sumber