Saya tidak terlalu mengenal database dan teori di balik cara kerjanya. Apakah ada yang lebih lambat dari sudut pandang kinerja (memasukkan / memperbarui / query) untuk menggunakan Strings untuk Kunci Utama daripada bilangan bulat?
Saya tidak terlalu mengenal database dan teori di balik cara kerjanya. Apakah ada yang lebih lambat dari sudut pandang kinerja (memasukkan / memperbarui / query) untuk menggunakan Strings untuk Kunci Utama daripada bilangan bulat?
Jawaban:
Secara teknis ya, tetapi jika sebuah string masuk akal untuk menjadi kunci utama maka Anda mungkin harus menggunakannya. Ini semua tergantung pada ukuran tabel yang Anda buat dan panjang string yang akan menjadi kunci utama (string lebih panjang == lebih sulit untuk dibandingkan). Saya tidak perlu menggunakan string untuk tabel yang memiliki jutaan baris, tetapi jumlah pelambatan kinerja yang Anda dapatkan dengan menggunakan string pada tabel yang lebih kecil akan sangat kecil untuk sakit kepala yang dapat Anda miliki dengan memiliki bilangan bulat yang tidak berarti apa pun dalam kaitannya dengan data.
Masalah lain dengan menggunakan Strings sebagai kunci utama adalah bahwa karena indeks terus-menerus dimasukkan ke dalam urutan berurutan, ketika kunci baru dibuat yang akan berada di tengah urutan indeks harus di-resequenced ... jika Anda menggunakan otomatis angka integer, kunci baru baru saja ditambahkan ke akhir indeks.
Menyisipkan tabel yang memiliki indeks berkerumun di mana penyisipan terjadi di tengah urutan TIDAK menyebabkan indeks ditulis ulang. Itu tidak menyebabkan halaman yang terdiri dari data ditulis ulang. Jika ada ruang pada halaman di mana baris akan pergi, maka ditempatkan di halaman itu. Halaman tunggal akan diformat ulang untuk menempatkan baris di tempat yang tepat di halaman. Ketika halaman penuh, satu halaman akan terjadi, dengan setengah dari baris di halaman menuju ke satu halaman, dan setengah di yang lain. Halaman-halaman tersebut kemudian dihubungkan kembali ke daftar halaman yang terhubung yang terdiri dari tabel data yang memiliki indeks berkerumun. Paling-paling, Anda akhirnya akan menulis 2 halaman basis data.
String lebih lambat bergabung dan dalam kehidupan nyata mereka sangat jarang benar-benar unik (bahkan ketika mereka seharusnya). Satu-satunya keuntungan adalah mereka dapat mengurangi jumlah gabungan jika Anda bergabung ke tabel utama hanya untuk mendapatkan namanya. Namun, string juga sering berubah sehingga menciptakan masalah karena harus memperbaiki semua catatan terkait ketika nama perusahaan berubah atau orang tersebut menikah. Ini bisa menjadi hit kinerja besar dan jika semua tabel yang harus terkait entah bagaimana tidak terkait (ini terjadi lebih sering daripada yang Anda pikirkan), maka Anda mungkin memiliki ketidakcocokan data juga. Integer yang tidak akan pernah berubah sepanjang usia catatan adalah pilihan yang jauh lebih aman dari sudut pandang integritas data maupun dari sudut pandang kinerja. Kunci alami biasanya tidak begitu baik untuk pemeliharaan data.
Saya juga ingin menunjukkan bahwa yang terbaik dari kedua dunia sering menggunakan kunci peningkatan otomatis (atau dalam beberapa kasus khusus, GUID) sebagai PK dan kemudian menempatkan indeks unik pada kunci alami. Anda mendapatkan bergabung lebih cepat, Anda tidak mendapatkan duplikat catatan, dan Anda tidak perlu memperbarui sejuta catatan anak karena nama perusahaan berubah.
Tidak masalah apa yang Anda gunakan sebagai kunci utama selama itu UNIK. Jika Anda peduli tentang kecepatan atau desain database yang baik gunakan int kecuali Anda berencana mereplikasi data, kemudian gunakan GUID.
Jika ini adalah database akses atau aplikasi kecil maka siapa yang benar-benar peduli. Saya pikir alasan mengapa sebagian besar dari kita pengembang menampar int atau panduan lama di depan adalah karena proyek memiliki cara untuk tumbuh pada kami, dan Anda ingin meninggalkan sendiri pilihan untuk tumbuh.
Terlalu banyak variabel. Itu tergantung pada ukuran tabel, indeks, sifat dari domain kunci string ...
Secara umum , bilangan bulat akan lebih cepat. Tetapi apakah perbedaannya cukup besar untuk diperhatikan? Sulit dikatakan.
Juga, apa motivasi Anda untuk memilih string? Tombol peningkatan otomatis numerik seringkali jauh lebih mudah juga. Apakah itu semantik? Kenyamanan? Replikasi / keprihatinan terputus? Jawaban Anda di sini dapat membatasi opsi Anda. Ini juga mengingatkan opsi "hibrid" ketiga yang Anda lupa: Panduan.
Jangan khawatir tentang kinerja sampai Anda memiliki desain sederhana dan suara yang sesuai dengan pokok bahasan yang dideskripsikan dan cocok dengan tujuan penggunaan data. Kemudian, jika masalah kinerja muncul, Anda dapat mengatasinya dengan mengubah sistem.
Dalam hal ini, hampir selalu lebih baik menggunakan string sebagai kunci primer alami, asalkan Anda bisa memercayainya. Jangan khawatir jika itu adalah string, asalkan string tersebut cukup pendek, katakanlah sekitar 25 karakter maks. Anda tidak akan membayar harga yang besar dalam hal kinerja.
Apakah orang entri data atau sumber data otomatis selalu memberikan nilai untuk kunci alami yang seharusnya, atau kadang-kadang dihilangkan? Apakah sesekali salah dalam input data? Jika demikian, bagaimana kesalahan terdeteksi dan diperbaiki?
Apakah pemrogram dan pengguna interaktif yang menentukan kueri dapat menggunakan kunci alami untuk mendapatkan yang mereka inginkan?
Jika Anda tidak dapat mempercayai kunci alami, ciptakan pengganti. Jika Anda membuat pengganti, Anda mungkin juga menemukan integer. Maka Anda harus khawatir tentang di mana untuk menyembunyikan pengganti dari komunitas pengguna. Beberapa pengembang yang tidak menyembunyikan kunci pengganti datang untuk menyesalinya.
Indeks menyiratkan banyak perbandingan.
Biasanya, string lebih panjang daripada bilangan bulat dan aturan pemeriksaan dapat diterapkan untuk perbandingan, jadi membandingkan string biasanya lebih intensif secara komputasi daripada membandingkan bilangan bulat.
Namun, kadang-kadang, lebih cepat menggunakan string sebagai kunci utama daripada membuat gabung tambahan dengan string to numerical id
tabel.
Ya, tetapi kecuali Anda berharap memiliki jutaan baris, tidak menggunakan kunci berbasis string karena lebih lambat biasanya "optimasi prematur." Bagaimanapun, string disimpan sebagai angka besar sedangkan kunci numerik biasanya disimpan sebagai angka yang lebih kecil.
Satu hal yang harus diperhatikan, adalah jika Anda telah mengelompokkan indeks pada kunci apa pun dan melakukan sejumlah besar sisipan yang tidak berurutan dalam indeks. Setiap baris yang ditulis akan menyebabkan indeks untuk menulis ulang. jika Anda melakukan batch insert, ini benar-benar dapat memperlambat proses.
Dua alasan untuk menggunakan bilangan bulat untuk kolom PK:
Kita dapat menetapkan identitas untuk bidang bilangan bulat yang bertambah secara otomatis.
Ketika kita membuat PK, db membuat indeks (Cluster atau Non Cluster) yang mengurutkan data sebelum disimpan dalam tabel. Dengan menggunakan identitas pada PK, pengoptimal tidak perlu memeriksa urutan pengurutan sebelum menyimpan catatan. Ini meningkatkan kinerja pada tabel besar.
Apa alasan Anda memiliki string sebagai kunci utama?
Saya hanya akan mengatur kunci utama ke bidang integer kenaikan otomatis, dan menempatkan indeks pada bidang string.
Dengan begitu jika Anda melakukan pencarian di atas meja mereka harus relatif cepat, dan semua bergabung Anda dan pencarian normal akan tidak terpengaruh dalam kecepatan mereka.
Anda juga dapat mengontrol jumlah bidang string yang diindeks. Dengan kata lain, Anda dapat mengatakan "hanya mengindeks 5 karakter pertama" jika Anda merasa cukup. Atau jika data Anda bisa relatif sama, Anda bisa mengindeks seluruh bidang.
Dari sudut pandang kinerja - Ya string (PK) akan memperlambat kinerja bila dibandingkan dengan kinerja yang dicapai menggunakan integer (PK), di mana PK ---> Primary Key.
Dari sudut pandang persyaratan - Meskipun ini bukan bagian dari pertanyaan Anda, saya tetap ingin menyebutkan. Saat kami menangani data besar di berbagai tabel, kami biasanya mencari set kunci yang mungkin dapat diatur untuk tabel tertentu. Ini terutama karena ada banyak tabel dan sebagian besar masing-masing atau beberapa tabel akan terkait dengan yang lain melalui beberapa hubungan (konsep Foreign Key). Oleh karena itu kita benar-benar tidak selalu dapat memilih integer sebagai Kunci Utama, melainkan kita pergi untuk kombinasi 3, 4 atau 5 atribut sebagai kunci utama untuk tabel itu. Dan kunci-kunci itu dapat digunakan sebagai kunci asing ketika kita akan menghubungkan catatan dengan beberapa tabel lainnya. Ini berguna untuk menghubungkan rekaman di berbagai tabel bila diperlukan.
Karenanya untuk Penggunaan Optimal - Kami selalu membuat kombinasi 1 atau 2 bilangan bulat dengan atribut 1 atau 2 string, tetapi sekali lagi hanya jika diperlukan.
Mungkin ada kesalahpahaman yang sangat besar terkait dengan string dalam database tersebut. Hampir semua orang mengira bahwa representasi basis data dari angka lebih kompak daripada untuk string. Mereka berpikir bahwa angka db-s direpresentasikan dalam memori. TAPI itu tidak benar. Dalam kebanyakan kasus, representasi angka lebih dekat dengan string seperti representasi daripada yang lain.
Kecepatan menggunakan angka atau string lebih tergantung pada pengindeksan daripada jenis itu sendiri.
Secara default ASPNetUserIds adalah 128 string char dan kinerjanya baik-baik saja.
Jika kunci HARUS unik di tabel itu harus Kunci. Inilah alasannya;
primary string key = Hubungan DB yang benar, 1 string kunci (Utama), dan 1 string Indeks (Utama).
Opsi lainnya adalah Kunci int khas, tetapi jika string HARUS unik, Anda mungkin masih perlu menambahkan indeks karena permintaan non-stop untuk memvalidasi atau memeriksa apakah unik.
Jadi menggunakan int identity key = Hubungan DB yang salah, 1 int key (Primer), 1 int index (Primer), Mungkin indeks string unik, dan secara manual harus memvalidasi string yang sama tidak ada (sesuatu seperti cek sql mungkin ).
Untuk mendapatkan kinerja yang lebih baik menggunakan int di atas string untuk kunci utama, ketika string HARUS unik, itu harus menjadi situasi yang sangat aneh. Saya selalu lebih suka menggunakan kunci string. Dan sebagai aturan praktis yang baik, jangan mendenormalkan database sampai Anda PERLU .