إذا كان لدي أنواع متعددة من الكائن، متى يجب أن يكون object.type سلسلة ومتى يجب أن يكون مفتاحًا خارجيًا؟

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

سؤال

لنفترض أن لدي كتبًا يمكن أن تكون رومانسية أو خيالية أو غامضة.لدي خياران واقعيان لتخزين هذه البيانات.أحدهما هو أن يكون هناك عمود كتابة في جدول كتبي يكون عبارة عن سلسلة ذات قيمة "الرومانسية" أو "الخيال" أو "الغموض".والآخر هو إنشاء جدول book_types وتخزين الأنواع هناك.بعد ذلك، ستحتوي كتبي على مفتاح خارجي type_id يشير إلى جدول book_types.

سؤالي هو كيف أختار الأفضل؟لقد رأيت طريقة السلسلة المستخدمة في البرنامج الإضافي Restful Authentication Rails الذي يحتوي على معلومات حول حالة المستخدم - "غير نشط"، "نشط"، "معلق"...

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

شكرًا!

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

المحلول

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

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

نصائح أخرى

وإذا كان هناك أبدا مزيد من المعلومات ليتم تخزينها ضد شيء، السلسلة عادة ما يرام (رغم أن هذا هو قيمة غير عابرة لذلك فمن غير طبيعي الشكل).

وهذا يبدو وكأنه مرشح جيد لجدول، ومع ذلك، قد ترغب في بذل المزيد من الجهد مع فئات لذلك ينبغي أن يكون الجدول المرجعي، المنظمة البحرية الدولية.

في معظم الحالات، يكون النهج باستخدام مفتاح خارجي لجدول منفصل هو الأفضل - المزايا:

  • يمنحك الجدول المنفصل طريقة قابلة للتمديد للتحقق من صحة الإدخال.وضع قيود فحص متشددة في تعريف الجدول ثم يتطلب جدول تغيير لإضافة نوع جديد

  • إذا كنت بحاجة إلى تغيير نوع النص لسبب ما (على سبيل المثال."الرومانسية" -> "الخيال النسائي" كمثال ضعيف)، سيكون لديك فقط تحديث بسيط لجدول البحث.

  • من الممكن أن يكون لديك أنواع لا توجد إدخالات لها حتى الآن ويتيح لك الجدول المنفصل استخدام صلة خارجية لتضمين النوع في مجموعات نتائج SQL.

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

فيما يتعلق بالأداء، مع الفهرس المناسب على FK، فإن أي محرك RDBMS سيعمل بشكل جيد - فالصلات هي ما تم تصميم RDBMS من أجله.

وأود أن استخدام كيه. معلومات أقل تكرار.

وتحرير: حل Betther: كود مسقل:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top