Ini telah menggangguku untuk sementara waktu. Sebagian besar waktu, ketika datang untuk menyimpan data dalam struktur seperti hashtables, programer, buku dan artikel bersikeras bahwa pengindeksan elemen dalam struktur tersebut dengan nilai String dianggap praktik yang buruk. Namun, sejauh ini, saya belum menemukan satu pun sumber seperti itu untuk menjelaskan mengapa itu dianggap praktik yang buruk. Apakah ini tergantung pada bahasa pemrograman? Pada kerangka kerja yang mendasarinya? Tentang implementasinya?
Ambil dua contoh sederhana, jika itu membantu:
Tabel seperti SQL tempat baris diindeks oleh kunci primer String.
Kamus .NET di mana tombolnya adalah Strings.
username
sebagai kunci utamausers
tabel mungkin bukan ide terbaik, dan Anda lebih suka id kenaikan otomatis. Tapi ituusername
adalah string yang hanya bersifat insidentil, menjadi properti yang bisa berubah adalah masalah utamaJawaban:
Itu semua ada hubungannya dengan dua hal pada dasarnya:
1) Kecepatan pencarian (di mana bilangan bulat misalnya ongkos jauh lebih baik)
2) Ukuran indeks (di mana indeks string akan meledak)
Sekarang semuanya tergantung pada kebutuhan Anda dan ukuran dataset. Jika tabel atau kumpulan memiliki 10-20 elemen di dalamnya, jenis kuncinya tidak relevan. Ini akan sangat cepat bahkan dengan kunci string.
PS Mungkin tidak terkait dengan pertanyaan Anda, tetapi Panduan dianggap buruk untuk kunci basis data juga (16 byte Guid vs 4 byte integer). Pada volume data yang besar Panduan harus memperlambat pencarian.
sumber
Ada satu masalah lagi dengan menggunakan string sebagai kunci, atau lebih tepatnya, menggunakan string literal sebagai kunci, mengesampingkan alasan kinerja / efisiensi murni. Salah ketik. Jika Anda menggunakan string literal sebagai kunci dalam kamus, Anda mengatur diri sendiri untuk kejutan yang tidak menyenangkan ketika seseorang
"ReceiverId"
menjadi a"RecieverId"
. Tetapkan konstanta untuk menyimpan nilai-nilai kunci dan menggunakannya kembali setiap kali Anda mengakses kamus.Sepele dan jelas, bisa dikatakan, namun sejumlah contoh kode .NET yang menakjubkan di web menggunakan string literal, menyebarkan praktik yang meragukan ini. ASP.NET dengan semua Sesi, ViewState, dan QueryParams yang tersebar di basis kode sangat bersalah di sini.
sumber
"1"
dan"1 "
di tabel yang sama.Ada banyak pengorbanan di sini. Sebenarnya saya sering menggunakan kunci string, tetapi sering saya menyertakan pengganti kunci sekunder untuk bergabung (jelas itu akan menjadi sebaliknya jika saya menggunakan MySQL). Namun ada beberapa kasus di mana saya tidak melakukannya.
Pertama, saya penggemar menyatakan kunci alami sebagai kunci utama di mana db dapat menangani ini dengan baik (misalnya PostgreSQL). Ini membantu normalisasi dan membuat desain database lebih jelas. Kunci pengganti membuat bergabung lebih mudah.
Ada dua alasan mengapa saya biasanya menambahkan kunci pengganti:
Tidak selalu jelas apa kunci alami itu. Terkadang ini harus diubah. Mengubah kunci komposit alami ketika digunakan untuk bergabung dan integritas referensial rumit dan rentan kesalahan.
Menggabungkan kinerja pada kunci komposit bermasalah dan sekali Anda pergi ke rute kunci alami, Anda terjebak di sana.
Dalam kasus di mana kunci alami adalah definisi, kolom tunggal, dan teks, bagaimanapun, saya biasanya bergabung dengan kunci string. Alasan saya untuk melakukannya adalah bahwa ini sering menghindari bergabung saat pencarian. Penggunaan yang paling umum adalah menyediakan desain db yang tepat di sekitar kasus penggunaan jenis enum. Dalam kebanyakan kasus, ini tidak memerlukan gabung tambahan untuk permintaan rutin. Jadi di mana ini kasusnya, kunci string sebagai tombol bergabung masuk akal.
Misalnya di LedgerSMB, kami menyimpan kategorisasi akun. Ini diidentifikasi oleh referensi string. Dan beberapa data lainnya disimpan dengan referensi string yang digunakan untuk menegakkan aturan mengenai kombinasi kategorisasi yang dapat mempengaruhi akun. Satu-satunya waktu yang dibutuhkan oleh logika adalah ketika menyimpan satu set kategorisasi, jadi kami bergabung dengan kunci string.
Seperti mengapa default akan menjadi kunci integer, saya tidak berpikir itu hanya masalah ukuran indeks. Masalah besar adalah manajemen kunci. Karena kuncinya adalah arbitrer dan Anda mungkin berurusan dengan jutaan catatan, Anda harus memiliki cara untuk menghasilkan string yang unik. Ada kasus di mana orang menggunakan UUID untuk ini, tetapi ada kemungkinan tidak ada tumbukan UUID, dan di mana miliaran catatan disimpan, peluang ini menjadi cukup tinggi yang mungkin benar-benar melihat sementara peluang tabrakan dengan tipe bilangan bulat meningkat adalah nol Menurut definisi.
sumber
Ada sejumlah masalah potensial dengan menggunakan string sebagai kunci, terutama ketika datang ke tabel seperti sql. Seperti yang disebutkan oleh @ kelinci, indeks untuk tabel Anda akan menjadi lebih besar, tapi saya pikir lebih signifikan, setiap hubungan kunci asing ke tabel akan melibatkan KEDUA tabel untuk mengandung string yang bertentangan dengan pengidentifikasi bobot-lebih ringan (integer) . Jika Anda menemukan bahwa ada lebih banyak tabel dengan referensi ke yang pertama, kunci string akan diperbanyak di seluruh basis data Anda.
sumber
Ini bukan ide yang buruk dalam dirinya sendiri, biasanya dengan 20/20 melihat ke belakang kompromi desain yang buruk. Fleksibilitas dan jangkauan string versus biaya dan kompleksitas tambahan.
Jika integer melakukan rentang pekerjaan dengan bijak dan sebagian besar pemrosesan yang mahal tidak perlu tahu apa yang diwakili bilangan bulat, gunakan satu.
sumber
Anda entah bagaimana mengambil data yang salah dari Hashtable.
Apakah maksud Anda "DaytimeTelephone" atau "EveningTelephone"?
atau
Apakah maksud Anda 1234567 atau 1234576?
Sementara angka bisa dibilang lebih efisien untuk mesin , kapan pun keadaan serba salah (dan memang begitu), itu tergantung pada Anda dan saya untuk memahami apa yang terjadi dan, pada saat itu, penghematan beberapa byte penyimpanan dan beberapa mikro (nano?) - detik pemrosesan hilang kejelasan setiap saat.
sumber
Banyak pertukaran dan tidak ada jawaban yang benar. Banyak programmer tidak akan pernah mempertimbangkan untuk menggunakan kunci string dalam database karena mereka tidak menyadari hashing dan cara kerja database. Kunci string selama mereka sangat stabil, atau tidak berarti (pengganti), adalah pilihan desain yang baik dalam banyak keadaan.
sumber
kunci string akan masuk akal, ketika datang ke tabel pencarian dengan sekitar 10-100 catatan string pendek; data terkait lebih mudah dibaca + mis. pelacakan perubahan (numeric / guid id vs string mis. "Administrator"); btw, database Keanggotaan ASP.NET menggunakan kunci string untuk AspNetRoles.
sumber