N+1 Problem

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

المقدمة

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

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


N+1 Problem

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

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

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

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

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

  • نكتب Query نجيب بيه List of Books من Books Table 
Select * from books;
  • لكل كتاب في قائمة الكتب هنعمل Request علي ال Authors Table عشان نجيب معلومات مؤلف الكتاب.
Select * from authors where authorID = <>;

 هنا إحنا روحنا للـ Database مرة عشان قائمة الكتب و عدد N من المرات - بعدد الكتب - عشان نجيب معلومات مؤلف كل كتاب.


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

SELECT Books.*, Authors.* FROM Books JOIN Authors ON Books.author_id = Authors.id;

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

N+1 Problem

تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀

النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉

Eqraatech Newsletter | Eqraatech - اقرأ-تِك | Substack
محتوى تقني متميز في مختلف مجالات هندسة البرمجيات باللغة العربية عن طريق تبسيط المفاهيم البرمجية المعقدة بشكل سلس وباستخدام صور توضيحية مذهلة. Click to read Eqraatech Newsletter, a Substack publication with hundreds of subscribers.

بفضل الله قمنا بإطلاق قناة اقرأ-تِك على التليجرام مجانًا للجميع 🚀

آملين بده اننا نفتح باب تاني لتحقيق رؤيتنا نحو إثراء المحتوى التقني باللغة العربية ، ومساعدة لكل متابعينا في انهم يوصلوا لجميع أخبار اقرأ-تِك من حيث المقالات ومحتوى ورقة وقلم والنشرة الأسبوعية وكل جديد بطريقة سريعة وسهلة

مستنينكوا تنورونا , وده رابط القناة 👇

https://t.me/eqraatechcom


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

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

  • ال Joins زي ما شرحنا في المثال
  • بما إن استخدام الـ ORMs من الحاجات اللي بتعرضنا بسهولة لظهور هذه المشكلة, نقدر نستعمل ال Eager Loading لحل المشكلة دي وهنا الـ ORM بيقوم بطلب البيانات المرتبطة ببعض من قبل استخدامها.

وكنا اتكلمنا قبل كده في ورقة عن الـ ORM تقدروا تشوفوها من هنا

Object Relational Mappers
ورقة وقلم وتعالوا نتكلم عن واحدة من أهم المفاهيم في عالم صناعة البرمجيات واللي مبسطة علينا حياتنا اليومية كمبرمجين ألا وهي الـ ORMs - Object Relational Mappers

ORM - Object Relational Mappers


المصادر

Visualizing the N+1 Problem in GraphQL
An overview of the N+1 data fetching problem in GraphQL and the request batching solution to solve it.

اشترك الآن بنشرة اقرأ-تِك الأسبوعية

لا تدع أي شيء يفوتك. واحصل على أحدث المقالات المميزة مباشرة إلى بريدك الإلكتروني وبشكل مجاني!