تكرار السؤال: …
الإجابة المختصرة
TPH تخزن كل الفئات المشتقة في جدول واحد باستخدام عمود تمييز (Discriminator) وهي الأسرع، بينما TPT تنشئ جدولاً لكل فئة فرعية وتربطها بـ JOIN وهي أبطأ في الاستعلامات المعقدة.
الشرح
الاستراتيجية الافتراضية في EF Core هي TPH؛ فإذا كان لديك كلاس أساسي Payment وكلاسين مشتقين CreditCardPayment و PaypalPayment، يتم حفظ الجميع في جدول واحد Payments مع عمود Discriminator يحدد النوع. تتميز TPH بالسرعة القصوى لعدم الحاجة لـ JOINs، ولكن عيبها هو وجود أعمدة فارغة (Nullable). في المقابل، توفر TPT تطبيعاً تاماً لقاعدة البيانات لكنها تتطلب استعلامات JOIN معقدة ومكلفة جداً مع تفرع الوراثة.
مثال بالكود
// تكوين TPH الافتراضي الأسرع
modelBuilder.Entity<Payment>()
.HasDiscriminator<string>("payment_type")
.HasValue<CreditCardPayment>("credit_card")
.HasValue<PaypalPayment>("paypal");أخطاء شائعة
- اختيار TPT في المشاريع الضخمة دون إدراك أن استعلام جلب قائمة الكيانات سينفذ استعلامات JOIN بطيئة جداً عبر عشرات الجداول.