تطبيع قواعد البيانات والفهارس: قرارات عملية

افهم كيف تمنع التكرار غير المنضبط، وكيف تعمل الفهارس، ومتى يحسّن الفهرس القراءة على حساب الكتابة والمساحة.

أسامة زيدانآخر تحديث: ١٨ يوليو ٢٠٢٦15 دقيقة قراءة

لماذا نطبّع البيانات؟

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

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

الفهرس ليس نسخة سحرية من الجدول

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

فهرس على email مفيد لاستعلام يبحث عن مساواة email، وقد يفرض uniqueness. لكنه لا يساعد تلقائيًا استعلامًا يطبق دالة غير مدعومة على العمود أو يبحث بنمط يبدأ wildcard. افحص خطة التنفيذ بدل افتراض أن وجود الفهرس يكفي.

فهرس مركب يطابق صندوق إشعارات المستخدم حسب الحالة والوقت.
CREATE INDEX notification_inbox_idx
ON notification_recipients (user_id, state, created_at DESC);

EXPLAIN ANALYZE
SELECT *
FROM notification_recipients
WHERE user_id = $1 AND state = 'UNREAD'
ORDER BY created_at DESC
LIMIT 20;

ترتيب أعمدة الفهرس المركب

الفهرس (user_id, state, created_at) يناسب استعلامًا يبدأ بتحديد user_id ثم state ثم يرتب بالوقت. لا يكون مكافئًا تلقائيًا لفهرس يبدأ created_at. قاعدة البيانات تستطيع عادةً استخدام البادئة اليسرى من الفهرس، لذلك اجمع أنماط الاستعلام المهمة قبل اختيار الترتيب.

لا تنشئ فهرسًا لكل عمود. الفهارس المتداخلة تزيد تكلفة الكتابة وقد لا تستخدم. راقب الاستعلامات البطيئة، وأضف فهرسًا يثبت عبر EXPLAIN ANALYZE أنه يخدمها، ثم راقب أثره على حجم التخزين وعمليات التحديث.

  • ابدأ بشروط المساواة عالية التحديد غالبًا.
  • ضع النطاق أو الترتيب بعد الأعمدة التي تثبت بالمساواة عندما يناسب الخطة.
  • استخدم partial index عندما يهمك جزء صغير مستقر من الصفوف.

متى نسمح بالتكرار المقصود؟

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

ابدأ بنموذج واضح ومطبع بدرجة معقولة، ثم حسّن بناءً على قياس. غالبًا يكون فهرس صحيح أو استعلام أفضل أو pagination كافيًا قبل تغيير النموذج. الأداء الجيد نتيجة فهم workload لا نتيجة قاعدة عامة مثل «joins بطيئة».

المراجع ومزيد من القراءة

عن المؤلف

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

صفحة المؤلف