sql - tutorial - relational database شرح




ما هي الأسباب*not*لاستخدام GUID لمفتاح أساسي؟ (6)

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

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

أدرك أنه لن يكون أبداً الخيار الأكثر فاعلية ، لكن إذا وضعنا الأداء جانباً ، أود أن أعرف ما إذا كانت هناك حجج فلسفية ضد هذه الممارسة؟

بناءً على الردود ، اسمحوا لي أن أوضح:

أتحدث باستمرار عن استخدام مفتاح بديل GUID كمفتاح أساسي - بصرف النظر عن ما إذا كانت المفاتيح الطبيعية أو المتسلسلة مصممة على الطاولة أم لا. هذه هي افتراضاتي:

  1. يمكن تصميم تكامل البيانات القائم على المفاتيح الطبيعية ، ولكن ليس مفترضًا.
  2. وظيفة المفتاح الأساسي هي التكامل المرجعي ، بغض النظر عن الأداء أو التسلسل أو البيانات.

أتساءل لماذا لا يوجد معيار نوع "miniGUID"؟ يبدو أن تنفيذ تجزئة لائقة على المعرف الفريد العمومي (GUID) يجب أن ينتج عنه رقم 64 بت الذي سيكون له احتمال تافه بسيط في أي عالم لا يحتوي على مليار أو أكثر من الأشياء فيه. نظرًا لأن الكون الذي تستخدم فيه معظم معرّفات GUID / miniGUID لن يتجاوز أبدًا مليون شيء ، أقل بكثير من مليار ، فإنني أعتقد أن miniGuid أصغر حجمًا من 8 بايت سيكون مفيدًا للغاية.

لا يعني ذلك بالطبع أنه يجب أن يستخدم كمؤشر مجمع. من شأنه أن يعوق الأداء إلى حد كبير. ومع ذلك ، فإن miniGUID 8 بايت فقط تضيع ثلث مساحة GUID الكامل (بالمقارنة مع فهرس 4 بايت).


أحد الأسباب التي يحتمل أن تكون كبيرة ، ولكن غالباً ما لا يتم التفكير فيها ، هو ما إذا كان يجب عليك توفير التوافق مع قاعدة بيانات Oracle في المستقبل.

نظرًا لأن Oracle لا يحتوي على نوع بيانات فريد من نوع العمود ، فقد يؤدي ذلك إلى كابوس قليلاً عندما يكون لديك نوعان مختلفان من البيانات لنفس المفتاح الأساسي عبر قاعدتي بيانات مختلفتين ، لا سيما عندما يتعلق الأمر بـ ORM.


إضافة إلى ewwwn:

الايجابيات

  • يجعل من المستحيل تقريبا للمطورين "بطريق الخطأ" فضح مفتاح بديل للمستخدمين (على عكس الأعداد الصحيحة حيث يحدث تقريبا في كل وقت).
  • يجعل دمج قواعد البيانات عدة أوامر من أبسط من التعامل مع أعمدة الهوية.

سلبيات

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

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

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

تحتاج حقًا إلى فصل مشكلتين:

1) المفتاح الأساسي هو بناء منطقي - أحد المفاتيح المرشحة التي تحدد كل صف في جدولك بشكل فريد وموثوق. يمكن أن يكون هذا أي شيء ، حقاً - INT ، والمعرف الفريد العمومي (GUID) ، سلسلة - اختر ما هو الأكثر منطقية للسيناريو الخاص بك.

2) مفتاح التجميع (العمود أو الأعمدة التي تحدد "فهرس مجمع" في الجدول) - هذا شيء متعلق بالتخزين الفعلي ، وهنا ، نوع بيانات صغير ومستقر ومتزايد باستمرار هو أفضل اختيار - INT أو BIGINT كخيار افتراضي لك.

افتراضياً ، يتم استخدام المفتاح الأساسي في جدول SQL Server أيضاً كمفتاح المجموعات - ولكن هذا لا يلزم أن يكون بهذه الطريقة! لقد شاهدت شخصياً مكاسب هائلة في الأداء عند تقسيم مفتاح Primary / Clustered (المفتاح) الأساسي السابق إلى GUID إلى مفتاحين منفصلين - المفتاح الأساسي (المنطقي) على GUID ، ومفتاح التجميع (الطلب) على IDTITY INT منفصل (1 ، 1) العمود.

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

نعم ، أعرف - هناك newsequentialid() في SQL Server 2005 وما فوق - ولكن حتى هذا ليس newsequentialid() تمامًا ، وبالتالي يعاني أيضًا من نفس المشاكل مثل المعرّف الفريد العمومي (GUID) - فقط أقل بروزًا.

ثم هناك مسألة أخرى يجب وضعها في الاعتبار: ستتم إضافة مفتاح التجميع على جدول إلى كل إدخال على كل فهرس غير متفاوت على الجدول الخاص بك أيضًا - وبالتالي فأنت تريد بالفعل التأكد من أنها صغيرة قدر الإمكان. عادة ، يجب أن تكون INT مع 2 + مليار صف كافية للغالبية العظمى من الجداول - ومقارنة مع المعرف الفريد العمومي (GUID) كمفتاح المجموعات ، يمكنك توفير مئات الميغابايت من التخزين على القرص وذاكرة الملقم.

حساب سريع - باستخدام INT مقابل. GUID كمفتاح أساسي ومجموعات عنقودية:

  • جدول أساسي مع صفوف 1000'000 (3.8 ميغابايت مقابل 15.26 ميغابايت)
  • 6 فهارس غير مدمجة (22.89 ميغابايت مقابل 91.55 ميجابايت)

TOTAL: 25 ميغابايت مقابل 106 ميغابايت - وهذا فقط على طاولة واحدة!

بعض المواد الغذائية للتفكير - أشياء ممتازة من قبل كيمبرلي تريب - قراءتها ، وقراءتها مرة أخرى ، وهضم ذلك! انها الانجيل الفهرسه SQL Server ، حقا.

مارك


يتحدث جيف أتوود عن ذلك بتفصيل كبير:
http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html

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

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


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

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





relational-database