Untuk apa kunci negatif digunakan?

12

Agak baru menggunakan database SQL standar (sebagian besar saat ini bekerja dengan MySQL) Saya belum menemukan banyak penggunaan ini.

Kapan dan mengapa bermanfaat memiliki kunci negatif (atau lebih tepatnya ditandatangani) yang mengindeks sebuah tabel?

Garet Claborn
sumber
5
pertama, siapa pun yang downvoting tanpa meninggalkan umpan balik, Anda melakukan tindakan merugikan. Selanjutnya, jawaban untuk pertanyaan yang sangat bagus ini.
jcolebrand
1
Subjek ini menarik. Saya pribadi belum pernah mendengar konsep ini. Pertanyaan ini seharusnya tidak pernah diturunkan. +1 dari saya untuk memperkenalkan konsep ini.
RolandoMySQLDBA

Jawaban:

13

Semua kunci utama adalah nilai yang telah kami tentukan adalah nilai yang paling penting dalam rekaman. Apakah kunci itu adalah int yang ditandatangani, int yang tidak ditandatangani, string, gumpalan (sebenarnya, ada batasnya) atau UUID (atau nama apa pun yang dibutuhkan hari ini), faktanya masih ada bahwa itu adalah kunci, dan itu adalah hal yang paling penting.

Karena kita tidak dibatasi untuk hanya menggunakan angka berorientasi positif untuk kunci kita, masuk akal untuk mempertimbangkan bahwa int yang ditandatangani hanya akan menjadi ~ 2 miliar, sedangkan int yang tidak ditandatangani akan menjadi ~ 4 miliar. Tapi tidak ada yang salah dengan menggunakan int yang ditandatangani, menetapkan nilai awal menjadi ~ -2 miliar dan menetapkan kenaikan satu. Setelah ~ 2 miliar rekaman Anda akan mencapai "nol" dan kemudian Anda akan terus ~ 2 miliar.

Mengenai mengapa akan membantu memiliki "kunci negatif" dalam sebuah tabel, itu pertanyaan yang sama dengan "mengapa membantu memiliki kunci dalam sebuah tabel". "Nilai" kunci tidak memengaruhi statusnya sebagai kunci. Kunci adalah kunci adalah kunci.

Yang penting adalah jika kuncinya valid.

Mengenai mengapa akan berguna untuk mengizinkan kunci yang negatif, saya dapat menyarankan beberapa alasan:

Bagaimana jika Anda ingin menunjukkan pengembalian dalam sistem penjualan sebagai nomor pesanan penjualan negatif, yang cocok dengan nomor pesanan penjualan positif, sehingga membuat korelasi mudah (ini naif, dan dirancang dengan buruk, tetapi itu akan bekerja dalam arti "spreadsheet").

Bagaimana jika Anda ingin memiliki tabel pengguna, dan mengindikasikan bahwa tabel dengan angka negatif dikontrol sistem (SO melakukan hal ini, untuk pengguna feed obrolan).

Saya bisa melanjutkan, tetapi sebenarnya satu-satunya alasan mengapa angka menjadi negatif adalah penting adalah jika Anda atau saya menetapkan kepentingan untuk itu. Selain itu, tidak ada alasan besar untuk nilai kunci untuk memiliki pengaruh pada kunci itu sendiri.

jcolebrand
sumber
Diedit sedikit 'kejadian niche', karena lebih dari kemungkinan kesalahpahaman karena kurang pengalaman. Baca menarik. Saya agak membayangkan akan ada situasi di mana nilai negatif dari kunci itu entah bagaimana berguna dalam pengkodean (i, e tanpa memutuskan itu berarti hal tertentu) tetapi ini pemikiran yang sangat berguna ketika Anda memiliki divisi yang kuat menjadi dua kelompok dan tidak ingin menggunakan bool tambahan: p
Garet Claborn
1
@ Garet ~ Jadi Anda membuat poin yang bagus: "nilai kunci itu entah bagaimana berguna dalam pengkodean" dan saya memang menggunakan kunci saya dari waktu ke waktu hanya dengan cara itu, tapi itu tidak ada hubungannya dengan aspek basis data. Basis data adalah gudang. Aplikasi yang mengkonsumsi data, di sisi lain, peduli dengan nilai - nilai . Tapi ya, +/- boolean adalah trik yang rapi, saya telah melihatnya menggunakan banyak waktu untuk efek seperti itu.
jcolebrand
2
-1 untuk mengimplikasikan bahwa nilai-nilai bertujuan ganda seperti ini adalah apa pun selain ide yang buruk. Anda membutuhkan int dan bool? Gunakan int dan bool.
Jack bilang coba topanswers.xyz
1
@JackPDouglas Saya tidak ingat mendorong orang untuk melakukan itu, saya benar-benar ingat menyiratkan bahwa bidang dan datanya adalah dua hal yang berbeda. Terima kasih untuk setidaknya menawarkan umpan balik konstruktif pada downvote Anda, tapi saya tidak bisa mengatakan bahwa pengamatan itu berarti apa pun dengan konsep "apa kunci negatif yang digunakan untuk" karena itu adalah masalah logika aplikasi, bukan masalah lapisan basis data . Saya memang ingin menyoroti bagaimana hal-hal itu digunakan di lapisan aplikasi, tetapi di lapisan basis data mereka tidak memiliki arti apa pun.
jcolebrand
1
@JackPDouglas ~ Saya menggunakan contoh khusus itu karena ada situs yang sangat terkenal (jaringan situs) yang mungkin Anda pernah dengar yang melakukan hal itu, jadi saya tidak ingin mengabaikannya, karena itu valid "menipu". Lihat pengguna ini dba.stackexchange.com/users/-1/community dan beri tahu saya apa ID-nya. Saya hampir dapat meyakinkan Anda bahwa userid adalah kunci utama (dan dalam banyak tabel lainnya adalah asing). Hanya karena itu desain aplikasi yang buruk untuk Anda, tidak berarti itu tidak valid. Tetapi sekali lagi, itu bukan desain db, itu desain domain. Memang, logika db mendukungnya
jcolebrand
10

Jika kita membahas tentang kolom identitas atau nomor otomatis, nilai itu sendiri seharusnya tidak memiliki arti. (Terkadang memang demikian, sesuai dengan pengguna obrolan SO yang disebutkan oleh drachenstern, yang telah saya lakukan sebelumnya)

Namun, umumnya Anda akan kehilangan setengah dari rentang Anda jika Anda menggunakan bilangan bulat yang ditandatangani.
Lihat: Apa yang harus dilakukan ketika bidang dalam tabel mendekati bilangan bulat 32 bit max ditandatangani atau tidak ditandatangani?

Contoh lain: Dalam skenario replikasi kecil, menggunakan nilai negatif untuk satu situs dan positif untuk yang lain memberikan beberapa pengetahuan implisit tentang sumber dari setiap baris yang diberikan.

gbn
sumber
dan pastikan Anda entah bagaimana membatasi input nilai di setiap situs jika tidak, Anda akan berakhir dalam kekacauan yang mengerikan ketika "pengetahuan implisit" Anda ternyata salah.
Jack bilang coba topanswers.xyz
@JackPDouglas: Anda akan menggunakan TIDAK UNTUK REPLIKASI untuk menghindari menghasilkan nilai di situs yang salah
gbn
bersama dengan kendala pemeriksaan ? Juga, apakah ada analog MySQL (atau lainnya) NOT FOR REPLICATIONyang Anda ketahui?
Jack bilang coba topanswers.xyz
@JackPDouglas: maaf, tidak yakin tentang non SQL Server
gbn
8

Tidak semua sistem database bahkan mendukung tipe integer yang tidak ditandatangani, MSSQL menjadi salah satu yang tidak. Dalam kasus ini, nilai negatif dimungkinkan dalam bidang kunci bilangan bulat hanya karena mereka mungkin dalam tipe (Anda bisa menggunakan aturan atau pemicu untuk memblokirnya, seperti yang ditunjukkan dalam contoh ini , tetapi mungkin tidak perlu menambahkan overhead untuk menegakkan aturan tersebut ke setiap inters / pembaruan).

Sejauh menyangkut database, nilai aktual kunci primer tidak masalah asalkan unik dalam tabel. Untuk itu -42 dan 42 hanyalah dua angka yang berbeda dengan cara yang sama yaitu 42 dan 69 - artinya hanya akan diberikan pada tingkat ketidak negatifan atau tidak dari nilai oleh kode Anda.

Tidak mendukung tipe integer yang tidak ditandatangani mungkin merupakan keputusan desain yang didasarkan pada pengurangan kompleksitas - yaitu tidak ingin dua tipe integer 32 bit yang berbeda khawatir tentang mengecek rentang ketika menetapkan nilai di antara mereka. Itu memang membatasi jumlah indeks yang mungkin dalam bidang kenaikan otomatis mulai dari 0 atau 1 hingga setengah dari apa yang mungkin terjadi dalam tipe yang tidak ditandatangani (~ 2e9 daripada ~ 4e9) tetapi ini jarang merupakan masalah yang signifikan (jika Anda kemungkinan membutuhkan sejumlah nilai kunci sebesar itu Anda mungkin pergi untuk jenis 64-bit tetap terutama jika menggunakan arsitektur 64-bit di mana nilai-nilai tersebut diproses tidak kurang efisien daripada yang 32-bit) meskipun jika Anda mungkin ingin jangkauan penuh dan perlu untuk tetap menggunakan 32-bit untuk alasan ruang Anda bisa memulai kenaikan di -2,147,483,647.

David Spillett
sumber
Yup, saya pikir kita sudah membahas tanah itu sebelumnya;) tehehe dba.stackexchange.com/questions/983/…
jcolebrand
tinyint tidak ditandatangani (0 .. 255). Saya biasanya membuat batasan pemeriksaan pada kolom integer untuk memastikan nilai tidak negatif, karena kode mau tidak mau akan ditulis yang secara implisit mengasumsikannya dan bug aneh akan muncul jika nilai negatif merayap masuk.
Ed Avis