ما هي إيجابيات وسلبيات استخدام المفاتيح الأساسية متعددة الأعمدة؟

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

سؤال

أود أن أرى مثالاً على ذلك:

  • عندما يكون هذا مناسبا
  • عندما لا يكون هذا مناسبا

هل هناك وقت يحدث فيه اختيار قاعدة البيانات فرقًا في الأمثلة المذكورة أعلاه؟

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

المحلول

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

بعض الناس سوف يصرون على استخدام واحد أو الآخر فقط. اقض وقتا كافيا في العمل مع قواعد بيانات الإنتاج وستعلم عدم وجود أفضل ممارسة مستقلة في السياق.

تستخدم بعض هذه الإجابات مصطلحات SQL Server ولكن المفاهيم تنطبق بشكل عام على جميع منتجات DBMS:


أسباب استخدام مفاتيح العمود الوحيد:

  • المؤشرات المفتوحة. يقوم مؤشر متفاوت المسافات دائما بأفضل أفضل عندما يمكن لقاعدة البيانات إلحاق به - خلاف ذلك، يجب أن يقوم DB بذلك انشقاقات الصفحة. وبعد لاحظ أن هذا ينطبق فقط إذا كان المفتاح تسلسلي, ، أي إما تسلسل الزيادة التلقائية أو GUID متسلسل. من المحتمل أن تكون GUIDs التعسفي أسوأ بكثير للأداء.

  • العلاقات. إذا كان المفتاح الخاص بك هو 3، 4، 5 أعمدة طويلة، بما في ذلك أنواع الأحرف وغيرها من البيانات غير المدمجة، وينتهي بك الأمر إلى إضاعة متألق كميات من المساحة وخفض الأداء لاحقا إذا كان عليك إنشاء علاقات مفاتيح أجنبية بهذا المفتاح في 20 طاولة أخرى.

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

  • التوافق. معظم الناس لن يتعين عليهم التعامل مع هذا، ولكن إذا كان المفتاح الطبيعي يحتوي على شيء مثل hierarchyid, ، من المحتمل أن بعض الأنظمة لا يمكن حتى قراءتها حتى. في هذه الحالة، مرة أخرى لك يجب قم بإنشاء مفتاح بديل بسيط يتم إنشاؤه تلقائيا للاستخدام بواسطة هذه التطبيقات. حتى إذا لم يكن لديك أي بيانات "غريبة" في المفتاح الطبيعي، فإن بعض مكتبات DB لديها الكثير من المشاكل التي تتعامل مع مفاتيح أساسية متعددة الأعمدة، على الرغم من أن هذه المشكلة تذهب بسرعة.

أسباب استخدام مفاتيح طبيعية متعددة العمود

  • تخزين. العديد من الأشخاص الذين يعملون مع قواعد البيانات لا يعملون أبدا مع العديد منهم يتعين عليهم الاهتمام بهذا العامل. ولكن عندما يحتوي الجدول بمليارات أو تريليونات من الصفوف، سترغب في الحفاظ على الحد الأدنى المطلق من البيانات في هذا الجدول الذي يمكن أن تستطيعه.

  • تكرار. نعم، يمكنك استخدام GUID أو GUID متسلسل. لكن GUIDs لها مقايضات خاصة بهم، وإذا لم تستطع أو لا ترغب في استخدام GUID لسبب ما، فإن مفتاح طبيعي متعدد الأعمدة هو خيار أفضل بكثير لسيناريوهات النسخ المتماثل لأنه هو جوهريا فريدة من نوعها عالميا - وهذا هو، أنت لا تحتاج إلى خوارزمية خاصة لجعلها فريدة من نوعها، فهي فريدة من نوعها حسب التعريف. وبعد هذا يجعل من السهل جدا التفكير في الهندسة الموزعة.

  • إدراج / تحديث الأداء. وبعد مفاتيح البديلة ليست حرة. إذا كان لديك مجموعة من الأعمدة فريدة من نوعها و كثيرا ما تستعدث عن، وبالتالي تحتاج إلى إنشاء فهرس تغطية على هذه الأعمدة؛ ينتهي المؤشر كونه كبيرا تقريبا مثل الجدول، الذي يضيع المساحة و يتطلب تحديث مؤشر ثان في كل مرة تقوم فيها بإجراء أي تعديلات. إذا كان من الممكن من أي وقت مضى أن يكون لديك فقط واحد الفهرس (الفهرس المتراكب) على جدول، يجب عليك القيام بذلك!


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

نصائح أخرى

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

  • مع المفتاح الأساسي الذي تم إنشاؤه تلقائيا، ستتمكن من إضافة مراجع بسهولة إلى هذا الجدول من الجداول الأخرى.
  • تعمل المفاتيح الأولية التي تم إنشاؤها تلقائيا بشكل أكبر مع مكتبات Orm.
  • أيضا، إذا تغيرت تقييد تفردك في المستقبل، فلن تضطر إلى تغيير المفاتيح الأساسية الحالية.

لقد قمت بتشغيل العديد من المواقف التي تحفز الصداع لأن DBA اعتقدت أن مفتاح أساسي متعدد الأعمدة سيكون دائما كافيا، وتأثير تغييرات المتطلبات المستقبلية هذه غير صحيحة.

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

عندما تريد مفتاحًا أساسيًا مكونًا من عمودين:

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

عندما تريد مفتاحًا أساسيًا للزيادة التلقائية:

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

بعض الأمثلة ...

ملائم:

  • أنظمة OLTP، في معظم الحالات عند تنفيذ العلاقات الأكثر إلى العديد من العلاقات.

غير مناسب:

  • بالنسبة للجداول البعدية في أنظمة OLAP - تريد أن تجعل مفتاح البعد الخاص بك صغير قدر الإمكان بحيث يكون جدول الحقائق الخاص بك صغيرا (وسريع) قدر الإمكان.

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

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

بشكل عام، من المحتمل أن تستخدم الحقول الحالية وتحديد الحقول الحالية كمفتاح أساسي عند الإمكان. إذا لم يكن لديك حقل معرف طبيعي، فستضطر إلى الجمع بين الكثير من الحقول للحصول على PK فريد من نوعه، فمن الأفضل أن تستخدم رقم تلقائي. المفاتيح الأساسية مع أكثر من 2 حقلا يمكن أن تحصل فوضوي.

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

في بعض الأحيان مفاتيح طبيعية مركبة تجعل الشعور بديهية. على سبيل المثال، لنفترض أن لديك طاولة لشركة (PK CompnyID) مع بعض التفاصيل من الشركة في الأعمدة. لديك أيضا شرط لتخزين اسم الرئيس التنفيذي لشركة الشركة حول تاريخها. الثابتة الطبيعية هي أن شركة واحدة يمكن أن يكون لها رئيس تنفيذي واحد فقط في وقت واحد. ثم فمن البديهية إنشاء جدول CompanyCo مع PK مركب من شركة Composite Company (FK To Company Company Company Company Company Company Company قد تكون الأعمدة الأخرى في الجدول هذا الجدول ورسالة. بهذه الطريقة يمكنك أن تضمن أن أحد الرئيس التنفيذي واحد فقط يمكن أن يبدأ في تاريخ معين.

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