Saya telah bekerja pada sejumlah sistem basis data di masa lalu di mana memindahkan entri di antara basis data akan menjadi jauh lebih mudah jika semua kunci basis data merupakan nilai-nilai GUID / UUID . Saya telah mempertimbangkan untuk menyusuri jalan ini beberapa kali, tetapi selalu ada sedikit ketidakpastian, terutama di seputar kinerja dan URL yang tidak dapat dibaca-lewat-telepon-bisa.
Adakah yang bekerja secara luas dengan GUID dalam database? Keuntungan apa yang akan saya dapatkan dengan pergi ke sana, dan apa kemungkinan jebakannya?
Jawaban:
Keuntungan:
Kekurangan:
Secara pribadi, saya menggunakannya untuk sebagian besar PK dalam sistem apa pun dari ukuran yang layak, tetapi saya "dilatih" pada sistem yang direplikasi di semua tempat, jadi kami HARUS memilikinya. YMMV.
Saya pikir data duplikat adalah sampah - Anda bisa mendapatkan data duplikat namun Anda melakukannya. Kunci pengganti biasanya disukai di mana pun saya pernah bekerja. Kami menggunakan sistem seperti WordPress:
UPDATE: Jadi yang ini banyak mendapat +1, dan saya pikir saya harus menunjukkan kelemahan besar GUID PK's: Clustered Indexes.
Jika Anda memiliki banyak catatan, dan indeks berkerumun di GUID, kinerja penyisipan Anda akan SUCK, karena Anda mendapatkan sisipan di tempat acak dalam daftar item (itu intinya), bukan pada akhirnya (yang cepat)
Jadi, jika Anda perlu menyisipkan kinerja, mungkin gunakan INT otomatis masuk, dan hasilkan GUID jika Anda ingin membaginya dengan orang lain (yaitu, perlihatkan kepada pengguna di URL)
sumber
example.com/35/old-and-busted
baru saja menjadiexample.com/35/new-hotness
dan aplikasi Anda cukup memeriksa judulnya dan meneruskan pengguna dengan 301.@Matt Sheppard:
Katakanlah Anda memiliki tabel pelanggan. Tentunya Anda tidak ingin pelanggan ada di tabel lebih dari sekali, atau banyak kebingungan akan terjadi di seluruh departemen penjualan dan logistik Anda (terutama jika beberapa baris tentang pelanggan berisi informasi yang berbeda).
Jadi, Anda memiliki pengenal pelanggan yang secara unik mengidentifikasi pelanggan dan Anda memastikan bahwa pengenal tersebut diketahui oleh pelanggan (dalam faktur), sehingga pelanggan dan orang layanan pelanggan memiliki referensi umum jika mereka perlu berkomunikasi. Untuk menjamin tidak ada rekaman pelanggan yang digandakan, Anda menambahkan kendala keunikan ke tabel, baik melalui kunci utama pada pengidentifikasi pelanggan atau melalui batasan NOT NULL + UNIK pada kolom pengidentifikasi pelanggan.
Selanjutnya, untuk beberapa alasan (yang tidak dapat saya pikirkan), Anda diminta untuk menambahkan kolom GUID ke tabel pelanggan dan menjadikannya sebagai kunci utama. Jika kolom pengidentifikasi pelanggan sekarang dibiarkan tanpa jaminan keunikan, Anda meminta masalah di masa mendatang di seluruh organisasi karena GUID akan selalu unik.
Beberapa "arsitek" mungkin memberi tahu Anda bahwa "oh, tapi kami menangani kendala keunikan pelanggan nyata di tingkat aplikasi kami!". Baik. Mode mengenai bahasa pemrograman tujuan umum dan (terutama) kerangka kerja tingkat menengah berubah sepanjang waktu, dan umumnya tidak akan pernah menyiarkan database Anda. Dan ada peluang yang sangat bagus bahwa Anda pada suatu saat perlu mengakses database tanpa melalui aplikasi yang ada. == Masalah. (Tapi untungnya, Anda dan "arsitek" sudah lama pergi, jadi Anda tidak akan ada di sana untuk membersihkan kekacauan itu.) Dengan kata lain: Tetap menjaga batasan yang jelas dalam database (dan di tingkatan lain, juga, jika Anda memiliki waktu).
Dengan kata lain: Mungkin ada alasan bagus untuk menambahkan kolom GUID ke tabel, tapi tolong jangan tergoda untuk membuat itu menurunkan ambisi Anda untuk konsistensi dalam informasi nyata (== non-GUID).
sumber
Mengapa tidak ada yang menyebutkan kinerja? Ketika Anda memiliki banyak gabungan, semua berdasarkan pada GUID jahat ini kinerjanya akan menembus lantai, sudah ada di sana :(
sumber
GUIDs dapat menyebabkan Anda banyak masalah di masa depan jika mereka digunakan sebagai "penyeimbang", membiarkan data yang digandakan masuk ke tabel Anda. Jika Anda ingin menggunakan GUID, harap pertimbangkan untuk tetap mempertahankan batasan UNIQUE pada kolom lain.
sumber
Keuntungan utama adalah bahwa Anda dapat membuat id unik tanpa terhubung ke database. Dan id adalah unik secara global sehingga Anda dapat dengan mudah menggabungkan data dari database yang berbeda. Ini tampak seperti keuntungan kecil tetapi telah menyelamatkan saya banyak pekerjaan di masa lalu.
Kerugian utama adalah sedikit lebih banyak penyimpanan yang dibutuhkan (bukan masalah pada sistem modern) dan id tidak benar-benar dapat dibaca manusia. Ini bisa menjadi masalah saat debugging.
Ada beberapa masalah kinerja seperti fragmentasi indeks. Tapi itu mudah dipecahkan (sisir dengan jimmy nillson: http://www.informit.com/articles/article.aspx?p=25862 )
Sunting menggabungkan kedua jawaban saya untuk pertanyaan ini
@Matt Sheppard Saya pikir maksudnya Anda dapat menduplikasi baris dengan GUID berbeda sebagai kunci utama. Ini adalah masalah dengan segala jenis kunci pengganti, bukan hanya GUID. Dan seperti yang dia katakan, ini mudah dipecahkan dengan menambahkan batasan unik yang bermakna pada kolom non-kunci. Alternatifnya adalah dengan menggunakan kunci alami dan mereka yang memiliki masalah nyata ..
sumber
Satu masalah kecil lainnya untuk dipertimbangkan dengan menggunakan GUIDS sebagai kunci utama jika Anda juga menggunakan kolom itu sebagai indeks berkerumun (praktik yang relatif umum). Anda akan menerima pukulan pada sisipan karena sifat panduan tidak memulai secara berurutan, sehingga mereka akan terbagi menjadi halaman, dll ketika Anda memasukkan. Hanya sesuatu yang perlu dipertimbangkan jika sistem akan memiliki IO tinggi ...
sumber
primary-keys-ids-versus-guids
Biaya GUID sebagai Kunci Utama (SQL Server 2000)
Mitos, GUID vs Autoincrement (MySQL 5)
Ini benar-benar yang Anda inginkan.
Pro UID
Kontra GUID
sumber
Ada satu hal yang tidak benar-benar diatasi, yaitu menggunakan ID acak (UUIDv4) sebagai kunci primer akan merusak kinerja indeks kunci primer . Ini akan terjadi apakah meja Anda dikelompokkan di sekitar kunci.
RDBM biasanya memastikan keunikan kunci primer, dan memastikan pencarian dengan kunci, dalam struktur yang disebut BTree, yang merupakan pohon pencarian dengan faktor percabangan besar (pohon pencarian biner memiliki faktor percabangan 2). Sekarang, ID integer berurutan akan menyebabkan sisipan terjadi hanya satu sisi pohon, meninggalkan sebagian besar simpul daun tidak tersentuh. Menambahkan UUID acak akan menyebabkan insersi membelah node daun di seluruh indeks.
Demikian juga jika data yang disimpan sebagian besar temporal, sering terjadi bahwa data terbaru perlu diakses dan digabungkan dengan yang paling banyak. Dengan UUID acak, polanya tidak akan mendapat manfaat dari ini, dan akan memukul lebih banyak baris indeks, sehingga membutuhkan lebih banyak halaman indeks dalam memori. Dengan ID berurutan jika data terbaru paling dibutuhkan, halaman indeks panas akan membutuhkan lebih sedikit RAM.
sumber