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?
database-design
database-recommendation
primary-key
Garet Claborn
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
NOT FOR REPLICATION
yang Anda ketahui?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.
sumber