نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
العودة للتغريدات
مشكلةتم الحل

بطء شديد في الـ API بسبب مشكلة N+1 Query Problem عند جلب المنشورات مع التعليقات في Prisma

L
lomo
·١٦ يوليو ٢٠٢٦·3 مشاهدة
يا شباب أنا بكتب API بيجلب قائمة المنشورات (Posts) وكل منشور معاه التعليقات بتاعته (Comments) عشان أعرضهم في الـ Feed.
المطلوب: جلب آخر 20 منشور مع اسم الكاتب وقائمة التعليقات لكل منشور وترجيعهم في الاستجابة.
المشكلة اللي مقابلاني: الـ API شغال وبيجيب البيانات صح، بس بياخد وقت طويل جداً (أكتر من 3-4 ثواني) لما البيانات بتزيد!
لما فتحت الـ Database Logs لقيت إن الكود بيعمل مئات الاستعلامات (Queries) لقاعدة البيانات في الطلب الواحد بدلاً من استعلام واحد أو اتنين! الكود البرمجي (المشكلة) :
TypeScript
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

async function getFeed() {
    // 1. استعلام يجلب المنشورات (1 Query)
    const posts = await prisma.post.findMany({
        take: 20,
    });

    // السطر المشتبه فيه: Loop بتعمل Query لكل عنصر في القائمة!
    const postsWithComments = await Promise.all(
        posts.map(async (post) => {
            const comments = await prisma.comment.findMany({
                where: { postId: post.id } // N Queries!
            });
            return { ...post, comments };
        })
    );

    return postsWithComments;
}
مشاكل-prismaأخطاء-قواعد-البياناتمشاكل-nodejsأداء-السيرفرحل-مشكلة-n1-queryكود-typescriptتطوير-backendتحسين-استعلامات-sqlمشاكل-javascript

التعليقات (1)

الحل المعتمد
abdelrahman
abdelrahmanمنذ 90 يوم
دي مشكلة شهيرة اسمها N+1 Query Problem. الكود بيعمل استعلام واحد (1) لجلب الـ 20 منشور، وبعدين جوه الـ map بيعمل استعلام إضافي (N) لكل منشور عشان يجيب التعليقات بتاعته. لو عندك 20 منشور = 21 استعلام! ولو جلبّت 100 منشور = 101 استعلام لقاعدة البيانات في نفس اللحظة، وده بيدمر أداء السيرفر والـ Database Connection Pool. الحل الصحيح والنهائي: استخدام خاصية الـ include المدمجة في Prisma لجلب العلاقة (Relation) في استعلام واحد محسن (JOIN) مباشرة من قاعدة البيانات:
TypeScript
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

async function getFeed() {
    // جلب المنشورات والتعليقات المترابطة في استعلام واحد مجمّع
    const postsWithComments = await prisma.post.findMany({
        take: 20,
        include: {
            comments: true, // Prisma ستقوم بعمل JOIN آلي وسريع جداً
            author: {
                select: { name: true, email: true } // جلب بيانات الكاتب أيضاً بفعالية
            }
        }
    });

    return postsWithComments;
}

سجّل دخولك لإضافة تعليق

تسجيل الدخول
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر