it-swarm.asia

Guid vs INT - أيهما أفضل كمفتاح أساسي؟

أنا أقرأ حول أسباب استخدام Guid و int أم لا.

int أصغر وأسرع ويسهل تذكره ويحافظ على تسلسل زمني. أما بالنسبة إلى Guid ، فإن الميزة الوحيدة التي وجدتها هي أنها فريدة. في هذه الحالة سيكون Guid أفضل من و int ولماذا؟

مما رأيت ، int ليس له عيوب إلا من خلال حد العدد ، وهو في كثير من الحالات غير ذي صلة.

لماذا تم إنشاء Guid بالضبط؟ أعتقد في الواقع أن لها غرضًا غير العمل كمفتاح أساسي لجدول بسيط. (أي مثال على تطبيق حقيقي يستخدم Guid لشيء ما؟)

اكتب (Guid = UniqueIdentifier) ​​على SQL Server

107
BrunoLM

تم طرح هذا في Stack Overflow هنا و هنا .

منشور جيف يشرح الكثير عن إيجابيات وسلبيات استخدام المعرف الفريد العمومي.

الايجابيات GUID

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

سلبيات GUID

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

إذا كنت متأكدًا من الأداء ولا تخطط لنسخ السجلات أو دمجها ، فاستخدم int ، وقم بتعيينها زيادة تلقائية ( مصدر الهوية في SQL Server ).

94
CoderHawk

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

19
TML

لقد استخدمت نهج هجين بنجاح. تحتوي الجداول على كل من عدد صحيح مفتاح أساسي للزيادة التلقائية id وعمود guid. يمكن استخدام guid حسب الحاجة لتحديد الصف بشكل فريد عالميًا ويمكن استخدام id للاستعلامات والفرز والتعرف البشري للصف.

18
rmirabelle

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

بالطبع ، عيب هذا هو مثل "قل لا للتدرج!"


أيضًا ، أعلم أن هذا لا يرتبط تمامًا ، ولكن هناك عامل آخر يتعلق بذلك. عندما لا يكون باهظًا ، أحاول عادةً التوصية باستخدام مفتاح أساسي غير مُنشأ تلقائيًا ، إذا كان ذلك منطقيًا. على سبيل المثال ، إذا كنت تقوم بحفظ معلومات برنامج التشغيل ، فلا تهتم بإنشاء عمود جديد تم إنشاؤه تلقائيًا لـ "ID" ، فقط استخدم رقم الترخيص.

أعلم أن هذا يبدو واضحًا حقًا ، لكني أرى أنه يتم نسيانه كثيرًا.

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

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

شكراVahiD على التوضيحات.

1
Alpha

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

1
golopot

rmirrabelle الجواب أعلاه - https://dba.stackexchange.com/a/96990/118371 هو ما أقوم به. ومع ذلك ، بالنسبة للمشاريع واسعة النطاق ، هناك تصميم نهائي.

الاستخدام: جدول تعيين رئيسي

TableA

- ID int (PK)
- Data varchar(100)

TableAMap

- ID int (PK)
- UniversalID GUID (Indexed - nonclustered)

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

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

0
Todd

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

مجرد فكرة وآمل أن أتذكر بشكل صحيح. أتمنى لك يوما عظيما!

0
bobo8734