Saya biasanya menggunakan ID kenaikan otomatis sebagai Kunci Utama dalam database. Saya mencoba mempelajari manfaat menggunakan GUID. Saya telah membaca artikel ini: https://betterexplained.com/articles/the-quick-guide-to-guids/
Saya menyadari bahwa GUID ini digunakan untuk mengidentifikasi objek di tingkat aplikasi. Apakah mereka juga disimpan sebagai kunci utama di tingkat basis data. Sebagai contoh, katakanlah saya memiliki kelas berikut:
public class Person
{
public GUID ID;
public string Name;
..
//Person Methods follow
}
Katakanlah saya ingin membuat orang baru di memori dan kemudian memasukkan Orang ke dalam basis data. Bisakah saya melakukan ini:
Person p1 = new Person();
p1.ID=GUID.NewGUID();
PersonRepository.Insert(p1);
Katakanlah saya memiliki database yang berisi jutaan dan jutaan baris dengan GUID sebagai Kunci Utama. Apakah ini akan selalu unik? Apakah saya bahkan memahami GUID dengan benar?
Saya membaca artikel ini sebelumnya: http://enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generated-ids/ . Ini sedikit membingungkan saya karena tampaknya merekomendasikan media bahagia antara GUID dan integer sebagai Kunci Utama.
Edit 11/06/18
Saya percaya bahwa Guids lebih cocok daripada int untuk kebutuhan saya. Saya menggunakan CQRS lebih banyak hari ini dan GUID cocok lebih baik.
Saya memperhatikan bahwa beberapa pengembang memodelkan GUID sebagai string dalam model domain, misal di sini: https://github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.OrderingMomain/AggregatesModel/BuyerAggregate/ Buyer.cs - dalam kasus ini: IdentityGuid adalah GUID yang dimodelkan sebagai string. Apakah ada alasan untuk melakukan ini selain dari yang dinyatakan di sini: Gunakan objek nilai khusus atau Panduan sebagai pengidentifikasi entitas dalam sistem terdistribusi? . Apakah "normal" untuk memodelkan GUID sebagai string atau haruskah saya memodelkannya sebagai GUID dalam model dan basis data?
sumber
Jawaban:
GUID menurut definisi "IDentifiers Global yang Unik". Ada konsep serupa tetapi sedikit berbeda di Jawa yang disebut UUID "Universally Unique IDentifiers". Nama-nama tersebut dapat dipertukarkan untuk semua penggunaan praktis.
GUID adalah pusat bagaimana Microsoft membayangkan pengelompokan basis data untuk bekerja, dan jika Anda perlu memasukkan data dari sumber yang terkadang terhubung, mereka benar-benar membantu mencegah tabrakan data.
Beberapa Fakta Pro-GUID:
Beberapa Ugeness dengan GUIDs
GUID akan membuat indeks Anda lebih besar, sehingga biaya ruang disk untuk mengindeks kolom akan lebih tinggi. GUID acak akan memecah indeks Anda.
Jika Anda tahu Anda tidak akan menyinkronkan data dari jaringan yang berbeda, GUID dapat membawa lebih banyak overhead daripada nilainya.
Jika Anda memiliki kebutuhan untuk menelan data dari klien yang terkadang terhubung, mereka bisa menjadi jauh lebih kuat untuk mencegah tabrakan kunci daripada mengandalkan pengaturan rentang urutan untuk klien tersebut.
sumber
Selalu? tidak, tidak selalu; ini adalah urutan bit yang terbatas.
Jutaan dan jutaan, Anda mungkin aman. Jutaan juta, dan kemungkinan tabrakan menjadi signifikan. Namun ada kabar baik: Anda sudah kehabisan ruang disk saat itu terjadi.
Kamu bisa; itu bukan ide yang sepenuhnya bagus. Model domain Anda biasanya tidak menghasilkan angka acak; mereka harus menjadi input untuk model Anda.
Selain itu, ketika Anda berurusan dengan jaringan yang tidak dapat diandalkan, di mana Anda mungkin mendapatkan pesan duplikat, UUID yang dihasilkan secara deterministik akan melindungi Anda dari memiliki entitas duplikat. Tetapi jika Anda menetapkan nomor acak baru untuk masing-masing, maka Anda memiliki lebih banyak pekerjaan yang harus dilakukan untuk mengidentifikasi duplikasi.
Lihat deskripsi uuid berbasis nama di RFC 4122
Saya tidak berpikir itu sangat berarti. Untuk sebagian besar model domain Anda, ini adalah pengidentifikasi ; satu-satunya pertanyaan yang Anda minta adalah apakah itu sama atau tidak dengan beberapa pengenal lainnya. Model domain Anda biasanya tidak akan melihat representasi memori dari pengidentifikasi.
Jika GUID tersedia sebagai "tipe primitif" di pengaturan agnostik domain Anda, saya akan menggunakannya; itu memungkinkan konteks pendukung untuk memilih optimasi yang sesuai yang mungkin tersedia.
Apa yang harus Anda kenali, bagaimanapun, adalah bahwa representasi pengidentifikasi, baik dalam memori maupun dalam penyimpanan, adalah keputusan yang Anda buat dalam implementasi Anda, dan oleh karena itu Anda harus mengambil langkah-langkah untuk memastikan bahwa cetak kaki kode digabungkan dengan keputusannya kecil - lihat Parnas 1972 .
sumber
GUID atau UUID kemungkinan besar akan unik karena bagaimana mereka dihasilkan dan mereka menyediakan cara yang aman untuk menjamin keunikan tanpa harus berkomunikasi dengan otoritas pusat.
Manfaat GUID sebagai Kunci Utama:
Dalam contoh yang Anda berikan:
Menentukan GUID sebelum waktu penyisipan dapat menyimpan perjalanan pulang-pergi ke basis data ketika memasukkan catatan anak berturut-turut dan memungkinkan Anda untuk mengikatnya dalam transaksi yang sama.
Kerugian pada GUID sebagai Kunci Utama:
Jika aplikasi Anda tidak memerlukan sharding atau clustering, akan lebih baik untuk tetap menggunakan tipe data yang lebih kecil dan lebih sederhana seperti int atau bigint.
Banyak basis data memiliki implementasi internal mereka sendiri yang berupaya untuk mengurangi masalah penyimpanan yang disebabkan oleh GUID dan SQL Server bahkan memiliki fungsi newitialentialid untuk membantu pemesanan UUID yang memungkinkan penggunaan indeks yang lebih baik dan mereka umumnya memiliki karakteristik kinerja yang lebih baik.
Selain itu, dari perspektif penguji, pengguna, atau pengembang yang bekerja dengan aplikasi, menggunakan ID melalui GUID akan secara signifikan meningkatkan komunikasi. Bayangkan harus membaca GUID melalui telepon.
Pada akhirnya, kecuali pengelompokan skala besar atau URL yang mengaburkan merupakan persyaratan, lebih pragmatis untuk tetap menggunakan ID peningkatan-otomatis.
sumber
Saya akan mengatakan tidak, jangan gunakan GUID sebagai kunci utama. Saya sebenarnya berurusan dengan DB seperti itu sekarang, dan mereka adalah salah satu penyebab utama masalah kinerja.
12 byte tambahan bertambah dengan cepat; ingat, sebagian besar PK akan menjadi FK di tabel lain, dan hanya tiga FK dalam sebuah tabel, Anda sekarang memiliki 48 byte tambahan untuk setiap baris. Itu bertambah dalam tabel dan indeks. Itu juga bertambah di disk I / O. 12 byte tambahan itu perlu dibaca dan ditulis.
Dan jika Anda tidak menggunakan pengurutan berurutan dan PK dikelompokkan (yang adalah apa yang terjadi secara default), SQL dari waktu ke waktu harus memindahkan seluruh halaman data untuk memeras lebih banyak ke "tempat" yang tepat. Untuk basis data transaksi yang sangat tinggi dengan banyak sisipan, pembaruan, dan penghapusan, segala sesuatunya cepat rusak.
Jika Anda memerlukan semacam pengidentifikasi unik untuk sinkronisasi atau semacamnya, tambahkan kolom panduan. Hanya saja, jangan menjadikannya PK.
sumber
Sejauh ini inilah alasan paling penting untuk menggunakan GUID.
Fakta bahwa Anda dapat membuat id unik tanpa kode Anda mengetahui atau berkomunikasi dengan lapisan kegigihan Anda adalah manfaat besar.
Anda dapat yakin bahwa objek Orang yang baru saja Anda buat di server, telepon pc, laptop, perangkat offline atau apa pun yang unik di semua server Anda di seluruh dunia yang didistribusikan.
Anda dapat menempelkannya dalam segala jenis basis data rdb atau no-sql, kirim, kirim ke layanan web apa pun atau buang segera setelah tidak dibutuhkan
Tidak, Anda tidak akan pernah mendapatkan tabrakan.
Ya, sisipan dapat sedikit lebih lambat karena indeks mungkin perlu dipikirkan.
Ya itu lebih besar dari int.
Saya tahu banyak orang merasa kuat tentang int masuk otomatis dan ini adalah topik kontroversial dengan DBA
Tapi aku benar-benar tidak bisa menyatakan dengan sangat kuat betapa hebatnya guids. Anda harus menggunakan panduan secara default di aplikasi apa pun.
int otomatis memiliki banyak banyak kekurangan
Anda menggunakan db No-Sql terdistribusi. Anda tidak bisa berbicara dengan semua contoh lain untuk mencari tahu apa nomor berikutnya.
Anda menggunakan sistem antrian pesan. Hal-hal perlu ID sebelum mereka mencapai db
Anda membuat beberapa item dan mengeditnya sebelum menyimpan. Setiap kebutuhan id sebelum Anda menekan db
Anda ingin menghapus dan memasukkan kembali baris. Pastikan Anda tidak menghitung jumlah tawaran otomatis dan kehabisan!
Anda ingin tidak mengekspos berapa banyak Pesanan yang telah Anda ambil tahun ini untuk setiap pengguna
Anda ingin memindahkan data yang dianonimkan dari produksi untuk menguji dan menjaga hubungan tetap utuh. Namun tidak menghapus semua data uji yang ada.
Anda ingin menggabungkan produk penyewa tunggal Anda ke dalam basis data multi penyewa tetapi setiap orang memiliki pesanan 56.
Anda membuat objek yang bertahan tapi fana. (pesanan tidak lengkap) lagi, jangan gunakan semua int Anda dengan hal-hal yang tidak ada lagi.
Daftar ini tidak ada habisnya dan semuanya adalah masalah nyata yang terjadi pada orang setiap saat. tidak seperti kehabisan ruang disk karena cols FK sedikit lebih besar
Akhirnya masalah besar dengan int adalah Anda kehabisan !!! ok secara teori Anda tidak, ada banyak. Namun dalam praktiknya Anda melakukannya karena orang tidak memperlakukannya seperti angka acak tanpa makna. mereka melakukan hal-hal seperti
oh saya tidak ingin pelanggan berpikir kami baru. mulai dari 10.000
Saya harus mengimpor banyak data jadi saya hanya menaikkan seed menjadi 1m sehingga kami tahu apa yang diimpor
kita membutuhkan kategori data. setiap periode dimulai pada jutaan berikutnya sehingga kita dapat menggunakan angka pertama sebagai angka ajaib
Saya menghapus dan mengimpor kembali semua data lagi dengan id baru. Ya, bahkan log audit.
gunakan nomor ini, yang merupakan kunci komposit, sebagai id dari hal lain ini
sumber
Di situlah Anda harus berhenti, di sana, dan memikirkan kembali.
Kunci utama basis data Anda TIDAK PERNAH memiliki arti bisnis. Seharusnya tidak ada artinya menurut definisi.
Jadi tambahkan GUID sebagai kunci bisnis Anda, dan kunci primer normal (biasanya int panjang) sebagai kunci primer basis data. Anda selalu dapat menempatkan indeks unik pada GUID untuk memastikan keunikan.
Itu berbicara teori database tentu saja, tapi itu praktik yang baik juga. Saya telah berurusan dengan basis data di mana kunci utama memiliki makna bisnis (satu pelanggan berpikir untuk menghemat beberapa sumber daya basis data dengan menggunakannya sebagai nomor karyawan, nomor pelanggan, dll. Misalnya) dan selalu menyebabkan masalah.
sumber
Selalu gunakan basis data yang dihasilkan, Kunci Utama (PK) peningkatan otomatis.
Mengapa menggunakan penambahan otomatis alih-alih GUID / UUID?
Tetapi bagaimana cara menangani pecahan, kelompok, dll.?
PK 3 kolom untuk tabel berkerumun mungkin ...
Tapi bagaimana dengan ...?
Banyak perjalanan ke basis data - Sebagian besar aplikasi tidak perlu secara unik mengidentifikasi catatan yang dibuat sampai dimasukkan ke dalam basis data sejak utas / sesi / apa pun itu hanya bekerja satu per satu. Jika aplikasi benar-benar membutuhkan kemampuan ini, gunakan aplikasi PK sementara yang dihasilkan yang tidak dikirim ke database . Biarkan database kemudian menempatkan PK kenaikan otomatis sendiri di baris saat dimasukkan. Sisipan akan menggunakan PK sementara, sementara pembaruan dan penghapusan akan menggunakan PK permanen yang ditugaskan oleh database.
Kinerja - Komputer dapat memproses bilangan bulat sederhana jauh lebih cepat dari yang lain karena domain yang jauh lebih besar jika nilai per elemen dalam GUID (37) vs. integer (10). Ingat juga bahwa setiap karakter dalam GUID harus dikonversi terlebih dahulu menjadi angka yang akan dimanipulasi oleh CPU.
Penyalahgunaan Umum Kunci Utama PK hanya memiliki satu tujuan ... untuk mengidentifikasi baris dalam tabel secara unik. Yang lainnya adalah penyalahgunaan yang terlalu umum.
Mendeteksi Catatan yang Hilang
Penyortiran
sumber
Seperti apa pun, ada kelebihan dan kekurangan untuk melakukan ini:
Yang baik:
Panjang kunci Anda selalu sama (basis data sangat besar dapat memiliki kunci sangat besar)
Keunikan dijamin cukup banyak - bahkan ketika Anda membuatnya dari sistem yang terpisah, dan / atau belum membaca ID terakhir dari database
Keburukan:
Seperti yang disebutkan banyak di atas - indeks yang lebih besar dan penyimpanan data.
Anda tidak dapat memesan dengan ID, Anda harus memesan dengan sesuatu yang lain. Lebih banyak indeks, mungkin kurang efisien.
Mereka kurang dapat dibaca manusia. Bilangan bulat biasanya lebih mudah diurai, diingat, dan diketik untuk orang. Menggunakan GUIDs sebagai ID dalam klausa WHERE di beberapa tabel yang digabungkan dapat membuat kepala Anda meleleh.
Seperti halnya segala sesuatu, gunakan sesuai kebutuhan, jangan dogmatis - dalam banyak situasi bilangan bulat yang bertambah secara otomatis lebih baik, kadang-kadang GUID hebat.
sumber
Ya, Anda dapat menggunakan GUID sebagai kunci utama. Sisi bawah adalah ukuran dan fragmentasi indeks yang cepat.
Kecuali jika Anda memerlukan keunikan di seluruh basis data (misalnya kluster) lebih disukai.
sumber
Inilah pendapat saya tentang masalah ini - solusinya adalah setengah jalan antara nilai-nilai GUID dan int, mengambil yang terbaik dari keduanya.
Kelas menghasilkan nilai Id pseudo acak (tetapi meningkat seiring waktu), yang mirip dengan GUID Comb .
Keuntungan utama adalah bahwa hal itu memungkinkan nilai Id dihasilkan pada klien, daripada menggunakan nilai kenaikan otomatis yang dihasilkan pada server (yang membutuhkan perjalanan bolak-balik) dengan risiko hampir nol dari nilai duplikat.
Nilai yang dihasilkan hanya menggunakan 8 byte daripada 16 untuk GUID, dan tidak bergantung pada satu urutan pengurutan database tertentu (misalnya Sql Server untuk GUID ). Nilai-nilai dapat diperluas untuk menggunakan seluruh jangka panjang yang tidak ditandatangani, tetapi ini akan menyebabkan masalah dengan basis data atau penyimpanan data lainnya yang hanya memiliki tipe bilangan bulat yang ditandatangani.
sumber