أغلب مشاكل قواعد البيانات ما تبدأ من السيرفر، ولا من حجم الترافيك، ولا حتى من لغة البرمجة. تبدأ من قرارات صغيرة اتخذت في مرحلة التصميم، وغالبًا بدون وعي كامل بتأثيرها لاحقًا.
مع الوقت، صرت ألاحظ أن نفس الأخطاء تتكرر في مشاريع مختلفة، فرق الفريق أو التقنية، لكن المنطق نفسه.
العلاقات (Relations): أبسط شيء… وأكثر شيء ينكسر
العلاقات بين الجداول غالبًا تُعامل كخطوة شكلية: foreign key هنا، relation في ORM هناك، وخلاص.
المشكلة أن كثير من التصاميم تبني العلاقات بناءً على "كيف أجيب البيانات بسرعة" وليس "كيف البيانات أصلًا مترابطة".
تشوف جداول مربوطة ببعضها فقط لأن الشاشة تحتاجها، أو علاقة many-to-many بدون سبب واضح، أو أسوأ شيء: علاقات غير موثقة يعتمد فيها الكود على افتراضات.
مع أول تغيير في المتطلبات:
- تبدأ الاستعلامات تتعقد
- يظهر تكرار بيانات
- ويصير أي تعديل مخاطرة
العلاقة الصحيحة مو اللي تشتغل اليوم، العلاقة الصحيحة هي اللي تتحمل التغيير بعد سنة.
ليش الـ Index مو حل سحري لكل شيء
أكثر رد سمعته لما يكون في بطء: "حط Index".
الـ Index أداة قوية، لكن استخدامها بدون فهم يخلق مشاكل بدل ما يحلها.
شفت جداول فيها:
- Indexes على كل عمود تقريبًا
- Indexes مكررة
- Indexes ما تُستخدم أصلًا
النتيجة؟
- عمليات insert و update أبطأ
- حجم قاعدة البيانات يكبر بدون فائدة
- تحسين وهمي لأن المشكلة أصلًا في التصميم
الـ Index يشتغل لما يكون:
- الاستعلام مفهوم
- نمط الاستخدام واضح
- والعلاقة بين الجداول صحيحة
غير كذا، أنت بس تخفف الألم مؤقتًا.
Query بطيء؟ غالبًا المشكلة مو في السيرفر
أول شيء يتهمه الناس: السيرفر.
"نحتاج نرفع RAM"، "نحتاج CPU أقوى"، "الداتابيس كبيرة".
لكن في كثير حالات، لما تفك الاستعلام نفسه، تكتشف أن المشكلة منطقية قبل ما تكون تقنية.
أمثلة شفتها كثير:
- JOIN على جداول مالها علاقة حقيقية
- استعلام واحد يحاول يخدم خمس حالات
- جلب بيانات أكثر من اللازم
الاستعلام البطيء غالبًا انعكاس لتصميم غير واضح:
- حدود الجداول غير دقيقة
- المسؤوليات متداخلة
- والبيانات ما لها owner واضح
ترقية السيرفر قد تخفي المشكلة، لكنها ما تحلها.
العلاقات الخاطئة تخلق منطق خاطئ في التطبيق
من أخطر الأشياء اللي شفتها: قاعدة بيانات تجبر التطبيق يتصرف بطريقة غير طبيعية.
تلقى الكود مليان:
- Workarounds
- Conditions غريبة
- تحويل بيانات في كل مكان
مو لأن المطور سيئ، بل لأن قاعدة البيانات ما تعكس الواقع.
لما العلاقة تكون خاطئة:
- الـ ORM يصير عدو
- الاستعلامات تتضاعف
- والأداء يصير عرض جانبي
قاعدة البيانات الجيدة تخلي الكود أبسط، مو العكس.