ما رأيك في استخدام UUID كمعرفات صف قاعدة البيانات، خاصة في تطبيقات الويب؟

StackOverflow https://stackoverflow.com/questions/5949

  •  08-06-2019
  •  | 
  •  

سؤال

لقد فضلت دائمًا استخدام الأعداد الصحيحة الطويلة كمفاتيح أساسية في قواعد البيانات، من أجل البساطة والسرعة (المفترضة).ولكن عند استخدام أ استراحة أو نظام URL يشبه Rails لمثيلات الكائنات، سأنتهي بعد ذلك بعناوين URL مثل هذا:

http://example.com/user/783

ومن ثم فإن الافتراض هو أن هناك أيضًا مستخدمين بمعرفات 782 و781 و... و2 و1.بافتراض أن تطبيق الويب المعني آمن بدرجة كافية لمنع الأشخاص من إدخال أرقام أخرى لعرض مستخدمين آخرين دون إذن، فإن مفتاحًا بديلًا بسيطًا تم تعيينه بشكل تسلسلي "يسرب" أيضًا العدد الإجمالي للمثيلات (أقدم من هذه الحالة)، في هذه الحالة المستخدمين ، والتي قد تكون معلومات مميزة.(على سبيل المثال، أنا المستخدم رقم 726 في نظام Stackoverflow.)

هل أ UUID/GUID هو الحل الأفضل؟ثم يمكنني إعداد عناوين URL مثل هذا:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

ليست موجزة تمامًا، ولكن هناك معلومات ضمنية أقل حول المستخدمين المعروضة.من المؤكد أنها تنم عن "الأمن من خلال الغموض" الذي ليس بديلاً عن الأمن المناسب، لكنه يبدو أكثر أمانًا على الأقل.

هل تستحق هذه الميزة تكلفة وتعقيد تنفيذ UUIDs لمثيلات الكائنات القابلة للعنونة على الويب؟أعتقد أنني ما زلت أرغب في استخدام أعمدة الأعداد الصحيحة كـ PKs لقاعدة البيانات فقط لتسريع عمليات الانضمام.

هناك أيضًا مسألة تمثيل UUID داخل قاعدة البيانات.أعلم أن MySQL يخزنها كسلاسل مكونة من 36 حرفًا.يبدو أن Postgres يتمتع بتمثيل داخلي أكثر كفاءة (128 بت؟) لكنني لم أجربه بنفسي.هل هناك أحد يمتلك خبرة لهذا؟


تحديث:لأولئك الذين سألوا عن استخدام اسم المستخدم في عنوان URL فقط (على سبيل المثال، http://example.com/user/yukondude)، يعمل بشكل جيد مع مثيلات الكائنات ذات الأسماء الفريدة، ولكن ماذا عن الملايين من كائنات تطبيق الويب التي لا يمكن تحديدها إلا من خلال الأرقام؟الطلبات، والمعاملات، والفواتير، وأسماء الصور المكررة، وأسئلة تجاوز سعة المكدس، ...

هل كانت مفيدة؟

المحلول

لا أستطيع أن أقول عن جانب الويب لسؤالك.لكن uuids تعتبر رائعة لتطبيقات الطبقة n.يمكن أن يكون توليد PK لامركزيًا:يقوم كل عميل بإنشاء PK خاص به دون التعرض لخطر الاصطدام.ويكون فرق السرعة صغيرًا بشكل عام.

تأكد من أن قاعدة البيانات الخاصة بك تدعم نوع بيانات تخزين فعال (16 بايت، 128 بت).على الأقل يمكنك تشفير سلسلة uuid في base64 واستخدام char(22).

لقد استخدمتها على نطاق واسع مع Firebird وأوصي بها.

نصائح أخرى

مقابل ما يستحق، لقد رأيت إجراءً مخزنًا طويل الأمد (أكثر من 9 ثوانٍ) ينخفض ​​إلى بضع مئات من المللي ثانية فقط من وقت التشغيل بمجرد التبديل من مفاتيح GUID الأساسية إلى الأعداد الصحيحة.هذا لا يعني عرض إن المعرف الفريد العمومي (GUID) فكرة سيئة، ولكن كما أشار آخرون، فإن الانضمام إليهم وفهرستهم، بحكم التعريف، لن يكون قريبًا من السرعة كما هو الحال مع الأعداد الصحيحة.

يمكنني الإجابة عليك أنه في خادم SQL إذا كنت تستخدم نوع بيانات المعرف الفريد (GUID) واستخدمت وظيفة NEWID () لإنشاء قيم، فسوف تحصل على تجزئة مروعة بسبب انقسامات الصفحات.والسبب هو أنه عند استخدام NEWID() فإن القيمة التي تم إنشاؤها ليست تسلسلية.أضاف SQL 2005 الدالة NEWSEQUANTIAL() لمعالجة ذلك

إحدى الطرق للاستمرار في استخدام GUID وint هي أن يكون لديك guid وint في جدول بحيث يتم تعيين guid إلى int.يتم استخدام الدليل خارجيًا ولكن يتم استخدام int داخليًا في قاعدة البيانات

على سبيل المثال

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

سيتم استخدام 1 و2 في الصلات والأدلة في تطبيق الويب.سيكون هذا الجدول ضيقًا جدًا ويجب أن يكون الاستعلام عنه سريعًا جدًا

لماذا تربط مفتاحك الأساسي مع URI الخاص بك؟

لماذا لا يكون مفتاح URI الخاص بك قابلاً للقراءة بواسطة الإنسان (أو لا يمكن تخمينه، اعتمادًا على احتياجاتك)، ويعتمد على عدد صحيح للفهرس الأساسي، وبهذه الطريقة تحصل على أفضل ما في كلا العالمين.تقوم الكثير من برامج المدونات بذلك، حيث يتم تحديد المعرف المكشوف للإدخال بواسطة "slug"، ويتم إخفاء المعرف الرقمي بعيدًا داخل النظام.

الميزة الإضافية هنا هي أن لديك الآن بنية عنوان URL رائعة حقًا، وهو أمر جيد لتحسين محركات البحث.من الواضح أن هذا ليس أمرًا جيدًا بالنسبة للمعاملة، ولكن بالنسبة لشيء مثل تدفق المكدس، فهو مهم (انظر عنوان URL في الأعلى...).الحصول على التفرد ليس بالأمر الصعب.إذا كنت مهتمًا حقًا، قم بتخزين تجزئة البزاقة داخل طاولة في مكان ما، وقم بالبحث قبل الإدراج.

يحرر: لا يستخدم Stackoverflow النظام الذي أصفه تمامًا، راجع تعليق Guy أدناه.

بدلاً من عناوين URL مثل هذا:

http://example.com/user/783

لماذا لا يكون:

http://example.com/user/yukondude

أيهما أكثر ودية للبشر ولا يسرب هذا القدر الضئيل من المعلومات؟

يمكنك استخدام عدد صحيح مرتبط برقم الصف ولكنه ليس متسلسلاً.على سبيل المثال، يمكنك أخذ 32 بت من المعرف التسلسلي وإعادة ترتيبها باستخدام مخطط ثابت (على سبيل المثال، البت 1 يصبح البت 6، والبت 2 يصبح البت 15، وما إلى ذلك).
سيكون هذا تشفيرًا ثنائي الاتجاه، وستكون على يقين من أن معرفين مختلفين سيكون لهما دائمًا تشفيرات مختلفة.
من الواضح أنه سيكون من السهل فك التشفير، إذا استغرق المرء الوقت الكافي لإنشاء معرفات كافية والحصول على المخطط، ولكن إذا فهمت مشكلتك بشكل صحيح، فأنت تريد فقط عدم التخلي عن المعلومات بسهولة شديدة.

نحن نستخدم المعرفات الفريدة العمومية (GUIDs) كمفاتيح أساسية لجميع جداولنا حيث أنها تتضاعف كمعرف RowGUID للنسخ المتماثل لـ MS SQL Server.يجعل الأمر سهلاً للغاية عندما يفتح العميل فجأة مكتبًا في جزء آخر من العالم...

لا أعتقد أن المعرف الفريد العمومي (GUID) يمنحك العديد من الفوائد.يكره المستخدمون عناوين URL الطويلة وغير المفهومة.

قم بإنشاء معرف أقصر يمكنك تعيينه إلى عنوان URL، أو فرض اصطلاح اسم مستخدم فريد (http://example.com/user/brianly).الرجال في 37إشارات من المحتمل أن يسخر منك القلق بشأن شيء كهذا عندما يتعلق الأمر بتطبيق ويب.

بالمناسبة، يمكنك إجبار قاعدة البيانات الخاصة بك على البدء في إنشاء معرفات صحيحة من قيمة أساسية.

يعتمد ذلك أيضًا على ما تهتم به في طلبك.بالنسبة لتطبيقات الطبقة n، تكون المعرفات الفريدة العمومية/UUIDs أسهل في التنفيذ كما أنها أسهل في النقل بين قواعد البيانات المختلفة.لإنتاج مفاتيح عدد صحيح، تدعم بعض قواعد البيانات كائن تسلسل محليًا ويتطلب بعضها إنشاءًا مخصصًا لجدول تسلسل.

من المحتمل أن توفر مفاتيح الأعداد الصحيحة (ليس لدي أرقام) ميزة لأداء الاستعلام والفهرسة بالإضافة إلى استخدام المساحة.يعد الاستعلام المباشر عن قاعدة البيانات أسهل بكثير باستخدام المفاتيح الرقمية، وتقليل النسخ/اللصق حيث يسهل تذكرها.

أنا أعمل مع نظام إدارة الطلاب الذي يستخدم UUID في شكل عدد صحيح.لديهم جدول يحمل المعرف الفريد التالي.

على الرغم من أن هذه ربما تكون فكرة جيدة من وجهة نظر معمارية، إلا أنها تجعل العمل عليها يوميًا أمرًا صعبًا.في بعض الأحيان تكون هناك حاجة إلى إجراء عمليات إدراج مجمعة، كما أن وجود UUID يجعل هذا الأمر صعبًا للغاية، وعادةً ما يتطلب كتابة المؤشر بدلاً من عبارة SELECT INTO البسيطة.

لقد حاولت كلاهما في تطبيقات الويب الحقيقية.

رأيي هو أنه من الأفضل استخدام الأعداد الصحيحة وأن يكون لها عناوين URL قصيرة ومفهومة.

باعتباري مطورًا، فإنه من المروع بعض الشيء رؤية الأعداد الصحيحة المتسلسلة ومعرفة أن بعض المعلومات حول إجمالي عدد السجلات تتسرب، ولكن بصراحة - ربما لا يهتم معظم الناس، ولم تكن هذه المعلومات مهمة حقًا لأعمالي على الإطلاق.

يبدو لي أن وجود عناوين URL طويلة قبيحة UUID يمثل أكثر من مجرد إيقاف للمستخدمين العاديين.

أعتقد أن هذه إحدى القضايا التي تثير جدلاً شبه ديني، ويكاد يكون الحديث عنها عديم الجدوى.أود فقط أن أقول استخدم ما تفضله.في 99% من الأنظمة، لا يهم نوع المفتاح الذي تستخدمه، وبالتالي فإن الفوائد (المذكورة في المنشورات الأخرى) لاستخدام نوع واحد على الآخر لن تكون مشكلة أبدًا.

أعتقد أن استخدام المعرف الفريد العمومي (GUID) سيكون الخيار الأفضل في حالتك.إنها تشغل مساحة أكبر ولكنها أكثر أمانًا.

يستخدم Youtube 11 حرفًا بتشفير Base64 الذي يوفر احتمالات 11^64، وعادةً ما تكون كتابتها سهلة جدًا.أتساءل عما إذا كان ذلك سيقدم أداءً أفضل من الأداء الكامل على UUID.UUID المحول إلى القاعدة 64 سيكون ضعف الحجم على ما أعتقد.

ويمكن الاطلاع على مزيد من المعلومات هنا: https://www.youtube.com/watch?v=gocwRvLhDf8

طالما أنك تستخدم نظام قاعدة بيانات مع سعة تخزينية فعالة، فإن محرك الأقراص الثابتة أصبح رخيصًا هذه الأيام على أي حال...

أعلم أن المعرفات الفريدة العمومية (GUID) يمكن أن تكون صعبة الاستخدام في بعض الأوقات وتأتي مع بعض الاستعلامات العامة ولكن من منظور أمني فهي منقذ.

التفكير في الأمان من خلال الغموض الذي يتناسب بشكل جيد عند تكوين معرفات URI غامضة وبناء قواعد بيانات موحدة باستخدام أمان محدد في الجدول والسجل والعمود لا يمكنك أن تخطئ فيه مع المعرفات الفريدة العمومية (GUID)، حاول القيام بذلك باستخدام معرفات قائمة على عدد صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top