it-swarm.asia

Apa kekurangannya dengan menggunakan UUID atau GUID sebagai kunci utama?

Saya ingin membangun sistem terdistribusi. Saya perlu menyimpan data dalam database dan akan sangat membantu untuk menggunakan UUID atau [~ # ~] guid [[# #]] sebagai kunci utama pada beberapa tabel. Saya menganggap itu adalah kelemahan dengan desain ini karena UUID/GUID cukup besar dan hampir acak. Alternatifnya adalah dengan menggunakan INT yang bertambah otomatis atau PANJANG.

Apa kekurangannya dengan menggunakan UUID atau GUID sebagai kunci utama untuk tabel saya?

Saya mungkin akan menggunakan Derby/JavaDB (di klien) dan PostgreSQL (di server) sebagai DBMS.

62
Jonas

Tergantung pada fungsi generasi Anda dan ukuran tabel akhir

GUID dimaksudkan untuk menjadi unik secara global pengidentifikasi. Seperti yang dibahas dalam dokumentasi Postgres 8. tidak ada metodologi yang secara universal sesuai untuk menghasilkan pengidentifikasi ini, tetapi postgreSQL tidak mengirim dengan beberapa kandidat yang lebih berguna.

Dari ruang lingkup masalah Anda, dan kebutuhan untuk offline menulis, Anda telah dengan rapi menghapus penggunaan apa pun selain GUID, dan oleh karena itu tidak ada keuntungan kompensasi dari skema lain.

Dari sudut pandang fungsional, panjang kunci biasanya tidak menjadi masalah pada segala jenis sistem modern, tergantung pada jumlah bacaan dan ukuran tabel. Sebagai metodologi alternatif, klien offline dapat mengelompokkan catatan baru tanpa kunci utama dan cukup memasukkannya saat menghubungkan kembali. Karena postgreSQL menawarkan tipe data "Serial", klien tidak akan perlu menentukan ID jika mereka dapat melakukan penulisan sederhana ke database.

29

Satu saran lagi - jangan pernah menggunakan GUID sebagai bagian dari indeks berkerumun. GUID tidak berurutan, jadi jika itu adalah bagian dari indeks berkerumun, setiap kali Anda memasukkan catatan baru, database akan perlu mengatur ulang semua halaman memorinya untuk menemukan tempat yang tepat untuk penyisipan, dalam kasus dengan kenaikan otomatis int (bigint), itu akan menjadi halaman terakhir.

Sekarang jika kita melihat beberapa realisasi db: 1.) MySQL - kunci utama dikelompokkan, tanpa opsi untuk mengubah perilaku - rekomendasinya adalah untuk tidak menggunakan GUID sama sekali di sini 2.) Postgres, MS-SQL - Anda dapat membuat GUID sebagai kunci utama tanpa gangguan, dan gunakan bidang lain sebagai indeks berkerumun, misalnya int autoincrement.

22
Ross Ivantsiv

Tergantung.

Serius, dengan semua yang Anda berikan sejauh ini, ini adalah sejauh yang Anda bisa lakukan.

Mengapa bermanfaat jika menggunakan UUID? Mengapa Anda tidak akan menggunakan INT? Mengapa Anda tidak bisa hanya mengindeks UUID nanti? Apakah Anda mengerti apa artinya memiliki daftar yang disortir dengan kunci UUID dan memasukkan UUID acak (tidak berurutan) setelah beberapa juta baris?

Platform apa ini akan berjalan? Berapa banyak disk? Berapa banyak pengguna? Berapa banyak catatan?

3
jcolebrand