Saya ingin membangun sistem terdistribusi. Saya perlu menyimpan data dalam database dan akan sangat membantu jika 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 atau LONG yang bertambah otomatis.
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.
Jawaban:
Itu tergantung pada fungsi generasi Anda dan ukuran tabel akhir
GUID dimaksudkan untuk menjadi pengidentifikasi unik secara global . Seperti yang dibahas dalam dokumentasi Postgres 8.3 tidak ada metodologi yang secara universal sesuai untuk menghasilkan pengidentifikasi ini, tetapi postgreSQL tidak dikirimkan dengan beberapa kandidat yang lebih berguna.
Dari ruang lingkup masalah Anda, dan kebutuhan akan penulisan offline , Anda telah dengan rapi mengotak-atik 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 mengumpulkan catatan baru tanpa kunci primer dan cukup memasukkannya saat menghubungkan kembali. Karena postgreSQL menawarkan tipe data "Serial", klien tidak perlu menentukan ID jika mereka dapat melakukan penulisan sederhana ke database.
sumber
{Node_ID, Item_ID}
mana setiap node memilikiNode_ID
, danItem_ID
yang secara otomatis bertambah per node.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, basis data akan perlu mengatur ulang semua halaman memorinya untuk menemukan tempat yang tepat untuk penyisipan, dalam kasus dengan peningkatan 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 - rekomendasi tidak menggunakan GUID sama sekali di sini 2.) Postgres, MS-SQL - Anda dapat menjadikan GUID sebagai kunci utama tidak acak, dan gunakan bidang lain sebagai indeks berkerumun, misalnya int autoincrement.
sumber
database would need to rearrange all its memory pages to find the right place for insertion
=> Saya tidak berpikir demikian halnya dengan Postgres, karena pengelompokan adalah opsional dan baris baru disimpan tanpa urutan.Tergantung.
Serius, dengan semua yang Anda berikan sejauh ini, ini adalah tentang 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 yang akan dijalankan ini? Berapa banyak disk? Berapa banyak pengguna? Berapa banyak catatan?
sumber