سؤال

التكرار المحتمل:
كيف تحب مفاتيحك الأساسية؟

أنا على دراية بفوائد استخدام المعرف الفريد العمومي (GUID)، بالإضافة إلى فوائد استخدام وINT كـ PK في قاعدة البيانات.مع الأخذ في الاعتبار أن المعرف الفريد العمومي (GUID) هو في جوهره INT 128 بت وأن INT العادي هو 32 بت، فإن INT يوفر مساحة (على الرغم من أن هذه النقطة موضع نقاش بشكل عام في معظم الأنظمة الحديثة).

في النهاية، في أي ظروف قد ترى نفسك تستخدم INT كـ PK مقابل GUID؟

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

المحلول

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

نصائح أخرى

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

بالطبع، تكون قيمة int أسهل للعين عند إجراء الاستعلامات اليدوية وإنشاء التقارير، وقد يزيد استهلاك المساحة من خلال استخدامات FK.

سأكون مهتمًا برؤية أي قياسات لمدى نجاحها على سبيل المثال.يتعامل SQL Server فعليًا مع الجداول ذات الإدخال الثقيل باستخدام IDENTITY PK.

للإجابة على سؤالك:في النهاية، في أي ظروف قد ترى نفسك تستخدم INT كـ PK مقابل GUID؟

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

INT عبارة عن مدخر للفضاء (على الرغم من أن هذه النقطة هي عمومًا في معظم الأنظمة الحديثة).

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

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

لدينا أدلة في برامج المؤسسة المعقدة للغاية في كل مكان.يعمل بسلاسة.

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

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

عند مقارنة قيم مثل علاقة المفتاح الأساسي بالمفتاح الخارجي، سيكون INT أسرع.إذا تمت فهرسة الجداول بشكل صحيح وكانت الجداول صغيرة، فقد لا ترى الكثير من التباطؤ، ولكن عليك تجربتها للتأكد.كما أن INTs أسهل في القراءة والتواصل مع الآخرين.

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

إذا كنت تستخدم بعض وظائف التعريف التلقائي لقاعدة البيانات الخاصة بك، فيمكن لقاعدة البيانات نظريًا التأكد تمامًا من عدم وجود أي تكرار.

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

إذا كانت البيانات موجودة في قواعد بيانات أو واجهات متعددة ومستقلة مع خدمة خارجية، فسأستخدم GUID من المحتمل أن يكون قد تم إنشاؤه بالفعل.ومن الأمثلة الجيدة على ذلك جدول UserProfiles في قاعدة البيانات الذي يقوم بتعيين المستخدمين في Active Directory إلى ملفات تعريف المستخدمين الخاصة بهم في التطبيق عبر objectGUID التي تم تعيينها لهم من قبل Active Directory.

إذا كنت تخطط لدمج قاعدة البيانات في مرحلة ما، على سبيل المثال، لإعداد نوع النسخ المتماثل متعدد المواقع، فإن Guid's ستوفر الكثير من الجهد.ولكن بخلاف ذلك أجد Int أسهل.

أعتقد دائمًا أن PK يجب أن يكون رقميًا حيثما أمكن ذلك.لا تنس أن وجود المعرفات الفريدة العمومية (GUIDs) كـ PK قد يعني أنها تُستخدم أيضًا في جداول أخرى كمفاتيح خارجية، لذلك سيكون الترحيل والفهرس وما إلى ذلك أكبر.

أعتقد أن قاعدة البيانات مهمة أيضًا.من منظور MySQL - بشكل عام، كلما كان نوع البيانات أصغر، كان الأداء أسرع.

يبدو أنه ينطبق على int vs GUID أيضًا -http://kcccoder.com/mysql/uuid-vs-int-insert-performance/

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

من المؤكد أن قراءة INT أسهل بكثير عند تصحيح الأخطاء، وأصغر بكثير.

ومع ذلك، سأستخدم المعرف الفريد العمومي (GUID) أو ما شابه ذلك كمفتاح ترخيص للمنتج.أنت تعلم أنها ستكون فريدة من نوعها، وتعلم أنها لن تكون تسلسلية.

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