MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menggunakan UUID alih-alih ObjectID di MongoDB

Menggunakan UUID di Mongo tentu saja mungkin dan didukung dengan cukup baik. Misalnya, dokumen Mongo mencantumkan UUID sebagai salah satu opsi umum untuk _id lapangan.

Pertimbangan

  • Kinerja – Seperti yang disebutkan oleh jawaban lain, tolok ukur menunjukkan UUID menyebabkan penurunan kinerja untuk sisipan. Dalam kasus terburuk yang diukur (berubah dari 10 juta menjadi 20 juta dokumen dalam koleksi) mereka sekitar ~2-3x lebih lambat – perbedaan antara memasukkan 2.000 (UUID) dan 7.500 (ObjectID) dokumen per detik. Ini adalah perbedaan besar tetapi signifikansinya sepenuhnya tergantung pada kasus penggunaan Anda. Apakah Anda akan menyisipkan jutaan dokumen sekaligus? Untuk sebagian besar aplikasi yang saya buat, kasus umum adalah memasukkan dokumen individual. Tolok ukur yang sama menunjukkan bahwa, untuk pola penggunaan tersebut, perbedaannya jauh lebih kecil (6.250 -vs- 7.500; ~20%). Tidak sepele.. tapi tidak menghancurkan bumi juga.
  • Portabilitas – Banyak platform DB lain memiliki dukungan UUID yang baik sehingga portabilitas akan ditingkatkan. Atau, karena UUID lebih besar (lebih banyak bit), ObjectID dapat dikemas ulang menjadi "bentuk" UUID. Pendekatan ini tidak sebaik portabilitas langsung, tetapi ini memberi Anda cara untuk "memetakan" antara ObjectID dan UUID yang ada.
  • Desentralisasi – Salah satu nilai jual besar UUID adalah bahwa mereka unik secara universal. Ini membuatnya praktis untuk menghasilkannya di mana saja, dengan cara yang terdesentralisasi (berbeda dengan, misalnya, nilai peningkatan otomatis, yang memerlukan sumber kebenaran terpusat untuk menentukan nilai "berikutnya"). Tentu saja, ID Objek Mongo juga mengakui manfaat ini. Perbedaannya adalah, UUID didasarkan pada standar berusia 15+ tahun dan didukung di (hampir?) semua platform, bahasa, dll. Ini membuatnya sangat berguna jika Anda perlu membuat entitas (atau secara khusus, kumpulan terkait entitas) dalam sistem yang terputus-putus, tanpa berinteraksi dengan database. Anda dapat membuat kumpulan data dengan ID dan kunci asing di tempatnya, lalu menulis seluruh grafik ke dalam database di beberapa titik di masa mendatang tanpa konflik. Meskipun ini juga dimungkinkan dengan ObjectIDs Mongo, menemukan kode untuk menghasilkannya/bekerja dengan format seringkali akan lebih sulit.

Koreksi

Bertentangan dengan beberapa jawaban lain:

  • UUID memiliki dukungan asli Mongo – Anda dapat menggunakan UUID() berfungsi di Mongo Shell dengan cara yang persis sama seperti Anda menggunakan ObjectID(); untuk mengonversi string UUID menjadi objek BSON yang setara.
  • UUID tidak terlalu besar – Saat dikodekan menggunakan subtipe biner 0x04 mereka 128 bit, dibandingkan dengan 96 bit untuk ObjectIDs. (Jika dikodekan sebagai string, mereka akan menjadi sangat boros, mengambil sekitar 288 bit.)
  • UUID dapat menyertakan stempel waktu – Secara khusus, UUIDv1 mengkodekan stempel waktu dengan presisi 60 bit, dibandingkan dengan 32 bit di ObjectIDs. Ini lebih dari 6 kali lipat lebih presisi, jadi nano-detik, bukan detik. Ini sebenarnya bisa menjadi cara yang layak untuk menyimpan stempel waktu yang dibuat dengan lebih akurat daripada dukungan objek Tanggal Mongo/JS, namun...
    • Bangun di UUID() function hanya menghasilkan UUID v4 (acak), jadi, untuk memanfaatkan ini, Anda harus mengandalkan aplikasi atau driver Mongo Anda untuk pembuatan ID.
    • Tidak seperti ObjectIDs, karena cara UUID dipotong, stempel waktu tidak memberi Anda urutan alami. Ini bisa baik atau buruk tergantung pada kasus penggunaan Anda. (Standar baru dapat mengubah ini; lihat pembaruan 2021 di bawah.)
    • Menyertakan stempel waktu di ID Anda terkadang merupakan Ide Buruk. Anda akhirnya membocorkan waktu pembuatan dokumen di mana pun ID terbuka. (Tentu saja ObjectIDs juga menyandikan stempel waktu jadi ini juga berlaku untuk mereka.)
    • Jika Anda melakukan ini dengan (sesuai spesifikasi) v1 UUID, Anda juga menyandikan bagian dari alamat MAC server, yang berpotensi digunakan untuk mengidentifikasi mesin. Mungkin bukan masalah bagi sebagian besar sistem tetapi juga tidak ideal. (Standar baru dapat mengubah ini; lihat pembaruan 2021 di bawah.)

Kesimpulan

Jika Anda memikirkan DB Mongo Anda secara terpisah, ObjectIDs adalah pilihan yang jelas. Mereka bekerja dengan baik di luar kotak dan merupakan default yang sangat mampu. Menggunakan UUID sebagai gantinya tidak tambahkan beberapa gesekan, baik saat bekerja dengan nilai (perlu mengonversi ke tipe biner, dll.) dan dalam hal kinerja. Apakah sedikit ketidaknyamanan ini layak untuk memiliki format ID standar benar-benar tergantung pada pentingnya Anda menempatkan portabilitas dan pilihan arsitektur Anda.

Apakah Anda akan menyinkronkan data antara platform basis data yang berbeda? Apakah Anda akan memigrasikan data Anda ke platform lain di masa mendatang? Apakah Anda perlu membuat ID di luar database, di sistem lain atau di browser? Jika tidak sekarang di beberapa titik di masa depan? UUID mungkin sepadan dengan kerumitannya.

Pembaruan Agustus 2021

IEFT baru-baru ini menerbitkan pembaruan draf untuk spesifikasi UUID yang akan memperkenalkan beberapa versi format baru.

Secara khusus, UUIDv6 dan UUIDv7 didasarkan pada UUIDv1 tetapi membalik potongan stempel waktu sehingga bit disusun dari yang paling signifikan hingga yang paling tidak signifikan. Ini memberikan nilai-nilai yang dihasilkan suatu tatanan alami yang (kurang lebih) mencerminkan tatanan di mana mereka diciptakan. Versi baru juga mengecualikan data yang berasal dari alamat MAC server, mengatasi kritik lama terhadap UUID v1.

Perlu waktu agar perubahan ini mengalir ke implementasi tetapi (IMHO) mereka secara signifikan memodernisasi dan meningkatkan format.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Konkurensi di gopkg.in/mgo.v2 (Mongo, Go)

  2. Apa yang harus saya pilih:MongoDB/Cassandra/Redis/CouchDB?

  3. Gunakan mongoexport dengan --query untuk ISODate

  4. Dapatkan hitungan total dokumen dengan MongoDB saat menggunakan batas

  5. Agregasi MongoDB di Loopback