برمجياتقراءة دقيقتين

معيار RFC 9562 يسمح بتغيير الوقت داخل UUIDv7، فلا يصلح بديلًا مضمونًا لعمود created_at

يقوم UUIDv7 على فكرة أن وقت الإنشاء محفور داخل المعرّف نفسه، ولذلك يحذف مطورون كثيرون عمود created_at وفهرسه ويعتمدون على المعرّف للترتيب ولمعرفة وقت الإنشاء. لكن مقالة نشرها Robert Alexander في 19 أكتوبر 2026 عادت إلى نص المعيار، ووجدت أنه لا يقدّم هذا الضمان.

فالمعيار RFC 9562 ينص على أن التطبيقات يجوز لها تعديل الوقت الفعلي، ولا يضمن مدى قرب هذا الوقت من الساعة الحقيقية، ويسمح بتقديمه على الساعة. أي أن الوقت داخل المعرّف تقريب لا وعد.

وأجرى الكاتب تجربة قابلة للتكرار على مكتبة uuid في Python. أرجع ساعة الجهاز ساعة كاملة، فرفضت المكتبة إعادة الوقت إلى الوراء وبدأت تقدّمه بدلًا من ذلك. وكبر الفرق عن الوقت الحقيقي مع كل دفعة من 100 ألف معرّف: 3695 ثانية، ثم 3795، ثم 3894، ثم 3994. وعندما يتجاوز التوليد معرّفًا واحدًا في الملي ثانية، يكبر هذا الفرق بلا حد.

وهناك قيد ثانٍ في العداد الذي يميّز المعرّفات المولّدة في الملي ثانية نفسها. فحدّه الأدنى في المعيار 12 بت، أي أنه يفيض عند نحو 4,096 معرّفًا في الملي ثانية في العقدة الواحدة. ويحذّر توثيق Postgres بدوره من أن الوقت المستخرج من المعرّف قد لا يساوي وقت توليده.

والأثر العملي أن الترتيب بـ UUIDv7 تقريبي. فالـ pagination أو عرض “الأحدث أولًا” القائم على المعرّف قد يعيد نتائج غير مرتبة في حالتين: رجوع الساعة إلى الوراء، أو إعادة تشغيل العملية. ولأن الوقت جزء من المعرّف، فإن مشاركة أي ID، في رابط صفحة شخصية مثلًا، تكشف وقت إنشاء الحساب بدقة عالية. ويصبح الإبقاء على عمود وقت الإنشاء أرخص من نتيجة استعلام خاطئة.

المصادر

  1. مقالة Robert Alexander
  2. نص المعيار RFC 9562
  3. توثيق دوال UUID في Postgres

من عدد السبت 13 جمادى الأولى - 24 أكتوبر

أخبار ذات صلة

برمجيات

صاحب rqlite يراجع 12 عامًا من نسخ SQLite: ثلاث مقاربات، وكل واحدة تجيب عن سؤال مختلف

المغزى: الخلاف داخل الفرق حول أداة نسخ قاعدة البيانات غالبًا ليس خلافًا على الأداة، بل على السؤال: هل المطلوب استرجاع رخيص بعد العطل، أم عدم القدرة على انتظار الاسترجاع أصلًا.

13 جمادى الأولى - 24 أكتوبر

أخبار السبت 13 جمادى الأولى - 24 أكتوبر