Mengapa kunci primer memiliki nama sendiri?

19

Dari pandangan matematis, mengingat bahwa sebuah tabel memiliki paling banyak satu kunci primer, tampaknya menjadi keputusan desain picik untuk merujuk ke kunci primer dengan beberapa nama arbitrer alih-alih properti tabel sederhana.

Sebagai konsekuensi untuk mengubah kunci utama dari nonclustered ke clustered atau sebaliknya, Anda harus terlebih dahulu mencari namanya, daripada menjatuhkannya dan akhirnya membacanya.

Apakah ada keuntungan menggunakan nama arbitrer yang tidak saya lihat atau ada DBMS yang tidak menggunakan nama arbitrer untuk kunci utama?

Edit 2011-02-22 (22/2/2011 untuk mereka yang tidak ingin mengurutkan tanggal di sana):

Biarkan saya menunjukkan fungsinya, yang dengannya Anda dapat memperoleh nama-nama kunci utama dari nama tabelnya (menggunakan tabel sistem sql-sever alias sybase awal):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

Sebagai gbn menyatakan tidak ada orang yang benar-benar menyukai nama yang dihasilkan, ketika Anda tidak memberikan nama eksplisit:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

saya baru saja dapat

PK__example___3213E83F527E2E1D

Tetapi mengapa nama dalam sysobject harus unik. Sangatlah OK untuk menggunakan nama yang persis sama untuk tabel dan kunci utamanya.

Melakukannya dengan cara itu, kami tidak perlu membuat konvensi penamaan, yang bisa dilanggar secara tidak sengaja.

Sekarang jawaban untuk Marian:

  1. Saya hanya menggunakan tugas mengubah clustered menjadi kunci primer nonclustered sebagai contoh di mana saya perlu tahu nama sebenarnya dari pk untuk dapat menjatuhkannya.
  2. Hal-hal tidak perlu memiliki nama yang tepat, itu sudah cukup jika mereka dapat dengan mudah dilambangkan secara unik. Itu adalah dasar dari abstraksi. Pemrograman berorientasi objek berjalan seperti ini. Anda tidak perlu menggunakan nama yang berbeda untuk properti serupa dari kelas yang berbeda.
  3. Ini arbitrer, karena ini adalah properti dari sebuah tabel. Nama tabel adalah semua yang perlu Anda ketahui jika Anda ingin menggunakannya.
bernd_k
sumber

Jawaban:

17

Kunci primer (dan batasan unik lainnya) diimplementasikan sebagai indeks, dan ditangani dengan cara yang persis sama - tidak masuk akal dari sudut pandang programmer untuk memiliki jalur kode yang terpisah untuk PK dan indeks (itu akan menggandakan potensi bug).

Selain disebut oleh kunci asing, PK hanyalah kendala unik yang pada gilirannya diimplementasikan sebagai indeks, sehingga mengubah sifat-sifat PK sama seperti mengubah sifat-sifat indeks lainnya. Juga memiliki nama eksplisit berarti mereka dapat dirujuk dalam petunjuk kueri seperti indeks lainnya.

David Spillett
sumber
1
Ya, itu juga berarti kolom mana yang digunakan karena PK dapat diubah. Jadi untuk buku, Anda mungkin menggunakan ISBN sebagai PK (yang ingin Anda panggil ISBN agar jelas), tetapi kemudian di pertengahan pengembangan Anda mungkin memutuskan bahwa Anda juga bisa menyediakan buku-buku bekas, artinya Anda akan menginginkannya. catatan terpisah (contoh dari atas kepala saya). Jadi, Anda harus mengubah bidang PK ke beberapa ID unik.
Nathan MacInnes
1
Saya lebih suka ungkapan: "PK adalah kendala yang menggunakan indeks" . Terkadang dua kendala (PK dan FK - atau 2 FK) dapat menggunakan indeks yang sama.
ypercubeᵀᴹ
@ ypercube Saya lebih suka "PK adalah kendala yang menggunakan indeks di 99,99% dari database dunia nyata" , yang tentu saja berarti bahwa mungkin untuk memiliki kendala PK tanpa indeks, namun tidak ada yang berencana untuk menggunakan database di dunia nyata akan menerapkannya karena alasan kinerja.
Pacerier
6

Tidak yakin saya mengerti sepenuhnya pertanyaannya.

Jika Anda memiliki indeks di atas meja dan Anda ingin / perlu mengubah indeks, apakah Anda juga tidak perlu mengubahnya sesuai dengan namanya? Saya kira Anda dapat mencari objectID untuk indeks dan melakukan pembaruan dengan cara itu, tetapi nama cenderung membantu orang untuk secara logis memahami objek apa yang mereka kerjakan.

Jadi, mungkin jawabannya adalah bahwa jika Anda memiliki konvensi penamaan yang kuat digunakan (yaitu, name_PK untuk Kunci Utama), maka Anda akan dapat dengan mudah mengidentifikasi bahwa Anda bekerja dengan kunci utama tabel.

Saya kira hal yang sama juga bisa dikatakan untuk mendefinisikan hubungan FK. Saya pikir penggunaan nama dilakukan untuk interpretasi logis, karena objek itu sendiri semuanya memiliki objectIDs berbeda.

SQLRockstar
sumber
5

Saya akan mengatakan itu adalah detail implementasi untuk keterbacaan manusia.

Nama kendala adalah opsional (di SQL Server setidaknya), tapi saya ingin memiliki PK_MyTableuntuk MyTabledaripadaPK_MyTabl___16feb6d8a

gbn
sumber
3

Secara historis, Kunci Utama dan Kunci Unik semuanya disebut Kunci Kandidat sebagaimana diajarkan oleh Christopher J. Date.

Kandidat Kunci adalah indeks yang Unik dan dapat memutar gulungan Kunci Utama. Dengan demikian, semua Kunci Kandidat adalah Kunci Unik. Kunci Utama hanyalah penunjukan salah satu Kunci Kandidat sebagai cara yang disukai untuk mengakses data tabel.

Mengingat hal ini, nama KUNCI UTAMA adalah nama sewenang-wenang dari kunci kandidat pilihan yang dilampirkan sebagai properti tabel. Hanya ada satu Kunci Utama.

Pada kenyataannya, membuat Calon Kunci bernama hanya cukup.

Untuk mengubah indeks dari clustered menjadi nonclustered dan kembali hanya akan menjadi latihan untuk menemukan KUNCI UTAMA, yang paling banyak 1 menurut definisi. Saya kira Anda dapat mengatakan bahwa memiliki definisi KUNCI UTAMA pada dasarnya adalah rasa nostalgia untuk puritan basis data. Rasa kemurnian basis data seharusnya memanggil kunci unik dengan kata kunci CANDIDATE KEY dan bukannya kata-kata yang sebenarnya UNIK.

Klik di sini untuk melihat Definisi Kunci Kandidat dan komentar CJDate tentangnya

RolandoMySQLDBA
sumber
1

Tidak ada yang mengatakan bahwa kunci utama akan mewakili objek tabel. Objek tabel adalah indeks berkerumun, bukan kunci utama. Tidak ada yang mengatakan bahwa kunci utama harus sama dengan indeks berkerumun. Seringkali memang demikian, tetapi tidak harus demikian. Kunci utama dapat dengan mudah ditegakkan oleh indeks non-clustered.

mrdenny
sumber