n+1 database backend web-development

N+1 Problem

الـ N+1 Problem هي مشكلة في طريقة تعاملنا مع قواعد البيانات ، ومن المشاكل اللي لازم احنا كمطورين ناخد بالنا منها لانها ليها ضريبة كبيرة أوي خصوصا في التعامل مع البيانات الكبيرة.

تم التحديث في 2024-08-03
تعديل على GitHub
N+1 Problem

الـ N+1 Problem هي مشكلة في طريقة تعاملنا مع قواعد البيانات ، ومن المشاكل اللي لازم احنا كمطورين ناخد بالنا منها لانها ليها ضريبة كبيرة أوي خصوصا في التعامل مع البيانات الكبيرة.

فورقة وقلم وتعالوا نتعرف على المشكلة دي وازاي نقدر نتجنبها


N+1 Problem

الـ N+1 Problem هي مشكلة بتخلينا نعمل عدد Requests أكبر بكتير من اللي محتاجينه وعشان نكون محددين فبالتحديد N+1 Requests على الرغم اننا ممكن نحل نفس المشكلة بعدد Requests أقل.

وطبعًا الـ Requests الكثيرة اللي ملهاش لزمة بتشغل الـ Database وبالتالي الموقع أو التطبيق بتاعنا بيكون أبطأ و بيدينا Performance سيء.

وعشان نفهم كويس خلينا ناخد مثال, أنت بتبرمج موقع لمكتبة وعاوز بيانات الكتب الأكثر مبيعًا وكمان بيانات عن المؤلفين للكتب دي عشان تعرضها في صفحة مخصصة.

بيانات الكتب الأكثر مبيعًا في Books Table وبيانات المؤلفين في Authors Table

فأول حل هيجي في بالنا:


-- أولاً: نجيب قائمة الكتب (1 query)
SELECT id, title, author_id FROM books WHERE bestseller = true;

-- ثانياً: لكل كتاب نجيب معلومات المؤلف (N queries)
SELECT id, name, bio FROM authors WHERE id = 1;
SELECT id, name, bio FROM authors WHERE id = 2;
SELECT id, name, bio FROM authors WHERE id = 3;
-- ... وهكذا لكل كتاب

-- النتيجة: 1 + N queries = N+1 problem
-- إذا كان لدينا 100 كتاب، سنحتاج 101 query!

دا هيخلي تحميل الصفحة بتاعت الكتب الأكثر مبيعًا على موقعك بطيئة جدًا بينما ممكن نحسّن من ال Performance بتاعنا بإننا نطلب البيانات من قاعدة البيانات في عدد أقل من ال Requests ودا بإننا نعمل اعادة هيكلة للـ Queries بتاعتنا.

هنا إحنا حلينا المشكلة أننا استخدمنا Join وقد يبدو ال Query هنا أكبر ولكنه أكفأ لأنه قاعدة البيانات بتعمل Query Optimization فتقدر تسرع الـ Query اللي قد يبدوا انه كبير بينما العدد الكبير من الـ Queries المنفصلة بيشغل قاعدة البيانات ومفيهوش مجال للـ Optimization

الـ N+1 من المشكلات الشائعة لأن كل البيانات اللي بنتعامل معاها في التطبيقات والمواقع بتكون مرتبطة ببعض بشكل ما أو بآخر , فلو عندنا موقع تواصل وحبينا نجيب ال Posts و نجيب ال Comments علي كل Post أو عندنا موقع توصيل طلبات وحبينا نعرض المطاعم وكذلك الأكلات اللي بيقدمها كل مطعم إلخ…

الحلول الممكنة:


-- 1. استخدام JOINs مع multiple tables
SELECT 
  b.id,
  b.title,
  b.price,
  a.name as author_name,
  p.name as publisher_name,
  p.location as publisher_location
FROM books b
INNER JOIN authors a ON b.author_id = a.id
INNER JOIN publishers p ON b.publisher_id = p.id
WHERE b.bestseller = true
ORDER BY b.sales_count DESC;

مواضيع ذات صلة
Databases & Storage

اشترك في النشرة البريدية

احصل على أحدث المحتوى والأخبار مباشرة في بريدك الإلكتروني

🔒 نحترم خصوصيتك. لن نشارك بريدك الإلكتروني مع أي طرف ثالث.