مزايا وعيوب مفاتيح قاعدة البيانات GUID / UUID

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

  •  09-06-2019
  •  | 
  •  

سؤال

لقد عملت على عدد من أنظمة قواعد البيانات في الماضي حيث كان من الممكن أن يكون نقل الإدخالات بين قواعد البيانات أسهل كثيرًا لو تم توفير جميع مفاتيح قاعدة البيانات المعرف الفريد العمومي / UUID قيم.لقد فكرت في اتباع هذا المسار عدة مرات، ولكن هناك دائمًا قدر من عدم اليقين، خاصة فيما يتعلق بالأداء وعناوين URL غير القابلة للقراءة عبر الهاتف.

هل عمل أي شخص على نطاق واسع مع المعرفات الفريدة العمومية (GUIDs) في قاعدة بيانات؟ما هي المزايا التي سأحصل عليها من خلال اتباع هذا الطريق، وما هي المخاطر المحتملة؟

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

المحلول

مزايا:

  • يمكن أن تولدها حاليا.
  • يجعل النسخ المتماثل تافهًا (على عكس int's، مما يجعل الأمر صعبًا حقًا)
  • عادة ما يكون ORM مثلهم
  • فريدة من نوعها عبر التطبيقات.لذلك يمكننا استخدام PK من نظام إدارة المحتوى (CMS) الخاص بنا (الدليل) في تطبيقنا (الدليل أيضًا) ونعلم أننا لن نواجه أي صراع أبدًا.

سلبيات:

  • استخدام مساحة أكبر، ولكن المساحة رخيصة
  • لا يمكن الطلب عن طريق المعرف للحصول على طلب الإدراج.
  • يمكن أن يبدو قبيحًا في عنوان URL، ولكن في الحقيقة، هل تقوم بوضع مفتاح قاعدة بيانات حقيقي في عنوان URL!؟
  • من الصعب القيام بالتصحيح اليدوي، ولكن ليس بهذه الصعوبة.

شخصيًا، أستخدمها في معظم عمليات PK في أي نظام ذي حجم مناسب، لكنني "تدربت" على نظام تم تكراره في كل مكان، لذلك كان علينا الحصول عليها.YMMV.

أعتقد أن مسألة البيانات المكررة هي هراء - يمكنك الحصول على بيانات مكررة كيفما تفعل ذلك.عادة ما تكون المفاتيح البديلة مستهجنة في أي مكان كنت أعمل فيه.نحن نستخدم نظامًا يشبه WordPress بالرغم من ذلك:

  • معرف فريد للصف (GUID/أيًا كان).أبدا مرئية للمستخدم.
  • يتم إنشاء المعرف العام مرة واحدة من بعض الحقول (على سبيل المثال.العنوان - اجعله عنوان المقال)

تحديث:لذلك تم إجراء 1+ على هذا كثيرًا، واعتقدت أنني يجب أن أشير إلى جانب سلبي كبير في GUID PK:الفهارس المجمعة.

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

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

نصائح أخرى

@ مات شيبارد:

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

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

بعد ذلك، لسبب ما (لا أستطيع التفكير فيه)، يُطلب منك إضافة عمود GUID إلى جدول العملاء وجعله المفتاح الأساسي.إذا تم ترك عمود معرف العميل الآن بدون ضمان التفرد، فأنت تطالب بمشاكل مستقبلية في جميع أنحاء المؤسسة لأن المعرفات الفريدة العمومية (GUID) ستكون فريدة دائمًا.

قد يقول لك بعض "المهندسين المعماريين" "أوه، لكننا نتعامل مع حقيقي قيد تفرد العميل في طبقة التطبيق لدينا!".يمين.تتغير الموضة المتعلقة بلغات البرمجة للأغراض العامة وأطر الطبقة المتوسطة (خاصة) طوال الوقت، ولن تتجاوز قاعدة البيانات الخاصة بك أبدًا.وهناك احتمال كبير جدًا أنك ستحتاج في مرحلة ما إلى الوصول إلى قاعدة البيانات دون المرور بالتطبيق الحالي.== مشكلة.(ولكن لحسن الحظ، أنت و"المهندس المعماري" قد رحلت منذ فترة طويلة، لذلك لن تكون هناك لتنظيف الفوضى). وبعبارة أخرى:احتفظ بالقيود الواضحة في قاعدة البيانات (وفي المستويات الأخرى أيضًا، إذا كان لديك الوقت).

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

المزايا الرئيسية هي أنه يمكنك إنشاء معرفات فريدة دون الاتصال بقاعدة البيانات.والمعرفات فريدة عالميًا بحيث يمكنك بسهولة دمج البيانات من قواعد بيانات مختلفة.تبدو هذه مزايا صغيرة ولكنها وفرت لي الكثير من العمل في الماضي.

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

هناك بعض مشاكل الأداء مثل تجزئة الفهرس.لكن هذه الأمور قابلة للحل بسهولة (أدلة مشطية بقلم جيمي نيلسون: http://www.informit.com/articles/article.aspx?p=25862 )

يحرر دمجت إجابتي على هذا السؤال

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

قد تسبب لك المعرفات الفريدة العمومية (GUID) الكثير من المتاعب في المستقبل إذا تم استخدامها كـ "موحدات"، مما يسمح للبيانات المكررة بالدخول إلى جداولك.إذا كنت تريد استخدام المعرفات الفريدة العمومية (GUIDs)، فيرجى مراعاة الاستمرار في الاحتفاظ بالقيود الفريدة على الأعمدة (الأعمدة) الأخرى.

لماذا لا يذكر أحد الأداء؟عندما يكون لديك صلات متعددة، يعتمد كل ذلك على هذه المعرفات الفريدة العمومية (GUIDs) السيئة، وسوف يمر الأداء عبر الأرضية، وكان هناك :(

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

معرفات المفاتيح الأساسية مقابل الأدلة

تكلفة المعرفات الفريدة العمومية (GUIDs) كمفاتيح أساسية (سكل سيرفر 2000)

الخرافات، GUID مقابل.زيادة تلقائية (ماي إس كيو إل 5)

هذا هو حقا ما تريد.

إيجابيات UID

  • فريد عبر كل جدول، وكل قاعدة بيانات، وكل خادم
  • يتيح سهولة دمج السجلات من قواعد بيانات مختلفة
  • يسمح بالتوزيع السهل لقواعد البيانات عبر خوادم متعددة
  • يمكنك إنشاء معرفات في أي مكان، بدلاً من الاضطرار إلى الذهاب ذهابًا وإيابًا إلى قاعدة البيانات
  • تتطلب معظم سيناريوهات النسخ المتماثل أعمدة GUID على أية حال

سلبيات GUID

  • إنها أكبر بأربع مرات من قيمة الفهرس التقليدية ذات 4 بايت؛يمكن أن يكون لهذا آثار خطيرة على الأداء والتخزين إذا لم تكن حذرًا
  • مرهقة للتصحيح (حيث معرف المستخدم = '{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • يجب أن تكون المعرفات الفريدة العمومية (GUID) التي تم إنشاؤها متسلسلة جزئيًا للحصول على أفضل أداء (على سبيل المثال، newsequentialid() في SQL 2005) ولتمكين استخدام الفهارس المجمعة

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

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

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

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