طلبتُ حقلًا واحدًا، فأرسل لي الـ API قاعدة البيانات بأكملها: كيف أنقذني GraphQL من إهدار الباندويث والبيانات غير اللازمة؟

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

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

تواصلت مع فريق الـ Backend وطلبت منهم الـ API Endpoint الخاص ببيانات المستخدم. أعطوني إياه، وبدأت الشغل. عملت الطلب (request) على الـ Endpoint اللي هو /api/users/{id}، وتفاجأت باللي رجع! يا زلمة، مش معقول! الـ API رجّعلي كائن JSON ضخم، فيه كل شيء ممكن تتخيله عن المستخدم: اسمه، إيميله، تاريخ ميلاده، عنوان بيته، رقم تليفونه، قائمة بكل طلباته السابقة على المنصة، سجل الدخول والخروج، حتى نوع المتصفح اللي بيستخدمه! أنا كل اللي بدي إياه حقلين، وهو بعثلي قاعدة البيانات كلها تقريباً.

في البداية، قلت “بسيطة، بمشيها”. لكن لما جربنا التطبيق على شبكة 3G بطيئة، كانت الكارثة. الصفحة بتاخذ 10-15 ثانية عشان تفتح! المستخدمين اشتكوا، والتطبيق كان بطيء جداً ومستهلك كبير لباقات الإنترنت. هنا أدركت إن المشكلة مش “بسيطة” أبداً، والمشكلة هاي إلها اسم في عالمنا: “Over-fetching”. ومن هنا بدأت رحلتي للبحث عن حل، حل اسمه GraphQL.

المشكلة المزدوجة: معضلات الـ REST API التقليدي

قبل ما نغوص في الحل، خلينا نفصّل المشكلة اللي واجهتني وبتواجه آلاف المطورين يومياً مع الـ REST APIs التقليدية. المشكلة إلها وجهين، زي العملة.

الوجه الأول: وحش إحضار البيانات الزائدة (Over-fetching)

هذا بالضبط ما حدث معي. أنت كعميل (Client)، سواء كنت تطبيق جوال أو موقع ويب، تطلب معلومة محددة، لكن الخادم (Server) مصمم ليرسل لك حزمة بيانات ثابتة وكبيرة تحتوي على ما طلبته وعلى أشياء أخرى كثيرة لا تحتاجها.

  • إهدار الباندويث (Bandwidth): تخيل آلاف المستخدمين يحمّلون بيانات لا حاجة لهم بها. هذا استهلاك هائل للبيانات على مستوى المستخدم وعلى مستوى الخوادم.
  • بطء التطبيق: كلما زاد حجم البيانات المنقولة، زاد وقت التحميل، مما يؤدي إلى تجربة مستخدم سيئة، وخصوصاً على اتصالات الإنترنت البطيئة.
  • زيادة الحمل على الخادم: الخادم يبذل مجهوداً في تحضير وإرسال بيانات لن يتم استخدامها.

الوجه الثاني: شبح إحضار البيانات الناقصة (Under-fetching)

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

باستخدام REST API نموذجي، سأضطر للقيام بالآتي:

  1. أرسل طلبًا إلى /api/users/{id} للحصول على بيانات المستخدم.
  2. بعد وصول الرد، أرسل طلبًا ثانيًا إلى /api/users/{id}/posts للحصول على قائمة مقالاته.
  3. ثم أقوم بفلترة المقالات على جانب العميل لأخذ آخر 3 فقط.

هذه العملية تسمى “Under-fetching” وتؤدي إلى مشكلة تعرف بـ “N+1 requests”. أنت بحاجة إلى معلومة واحدة، فتضطر لعمل طلب (1) رئيسي ثم عدد (N) من الطلبات الإضافية لجلب البيانات المرتبطة. هذا يسبب زيادة في عدد رحلات الذهاب والإياب بين العميل والخادم (Round-trips)، مما يزيد من تعقيد الكود ويبطئ التطبيق بشكل ملحوظ.

المنقذ وصل: أهلاً بك في عالم GraphQL!

وسط هذه المعمعة، وجدت ضالتي في تقنية اسمها GraphQL. فيسبوك طورتها داخلياً عام 2012 لحل هذه المشاكل تحديداً في تطبيقها للجوال، ثم أطلقتها كمشروع مفتوح المصدر في 2015.

شو قصة GraphQL يا جماعة؟

ببساطة شديدة، GraphQL هي لغة استعلام (Query Language) للـ API، وفي نفس الوقت هي بيئة تشغيلية (Runtime) لتنفيذ هذه الاستعلامات على الخادم.

فكر فيها كأنك في مطعم. الـ REST API مثل قائمة الطعام المحددة (Set Menu)، تطلب “وجبة الدجاج”، فتأتيك مع الأرز والسلطة والبطاطا والمشروب، سواء كنت تريدهم أم لا. أما GraphQL، فهي مثل قائمة الطعام الانتقائية (À la carte)، حيث تقول للنادل: “أريد قطعة الدجاج المشوي فقط، مع قليل من الملح”. تحصل على ما طلبته بالضبط، لا أكثر ولا أقل.

مع GraphQL، العميل هو من يقرر شكل البيانات التي يريدها. الخادم يجهز “مخطط” (Schema) لكل البيانات المتاحة، والعميل يرسل “استعلام” (Query) يحدد فيه الحقول التي يحتاجها بدقة.

لنوسّخ أيدينا قليلاً: GraphQL و REST وجهاً لوجه

الكلام النظري جميل، لكن خلينا نشوف مثال عملي يوضح الفرق الشاسع. لنفترض أن لدينا هذا الهيكل من البيانات: مستخدم (User) لديه مقالات (Posts)، وكل مقال لديه تعليقات (Comments).

النهج التقليدي مع REST API

للحصول على اسم مستخدم وعناوين مقالاته، ستقوم بالآتي:

الطلب الأول: GET /api/users/123

الرد (Over-fetching):


{
  "id": "123",
  "name": "أبو عمر",
  "email": "abu.omar@example.com",
  "birthDate": "1980-01-01T00:00:00.000Z",
  "address": {
    "street": "شارع يافا",
    "city": "القدس"
  },
  "createdAt": "2020-05-10T12:00:00.000Z"
  // ... والكثير من البيانات الأخرى
}

الطلب الثاني: GET /api/users/123/posts

الرد:


[
  {
    "id": "post1",
    "title": "مقدمة إلى GraphQL",
    "content": "محتوى طويل جداً...",
    "comments": [
      // ... قائمة بالتعليقات
    ]
  },
  {
    "id": "post2",
    "title": "لماذا عليك تعلم Docker؟",
    "content": "محتوى طويل آخر...",
    "comments": []
  }
  // ... والمزيد من المقالات
]

لاحظت المشكلة؟ طلبان، وبيانات هائلة لم أكن بحاجتها (مثل الإيميل، العنوان، محتوى المقال، والتعليقات).

النهج الذكي مع GraphQL

مع GraphQL، كل هذا يحدث في طلب واحد فقط، إلى نقطة نهاية واحدة (عادة /graphql).

الطلب (Query):

أنا، كمطور للواجهة الأمامية، أكتب هذا الاستعلام البسيط الذي يصف تماماً ما أريده:


query GetUserAndPostTitles {
  user(id: "123") {
    name
    posts {
      title
    }
  }
}

الرد (دقيق ومثالي):

الخادم يرد بملف JSON يطابق تماماً بنية الاستعلام الذي أرسلته:


{
  "data": {
    "user": {
      "name": "أبو عمر",
      "posts": [
        {
          "title": "مقدمة إلى GraphQL"
        },
        {
          "title": "لماذا عليك تعلم Docker؟"
        }
      ]
    }
  }
}

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

نصائح من “الختيار”: متى تستخدم GraphQL؟

بعد ما اشتغلت على مشاريع كثيرة، تعلمت أن كل تقنية إلها مكانها وزمانها. GraphQL مش حل سحري لكل المشاكل، لكنها تتألق في سيناريوهات معينة.

متى تكون GraphQL هي خيارك الأفضل؟

  • تطبيقات الجوال والواجهات الأمامية المعقدة (SPAs): أي تطبيق يكون فيه الباندويث محدوداً أو واجهة المستخدم تحتاج بيانات من مصادر متعددة ومترابطة، GraphQL هي الخيار الأمثل.
  • وجود عملاء متعددين (Multiple Clients): إذا كان لديك تطبيق ويب، وتطبيق iOS، وتطبيق Android، وكل منهم يحتاج مجموعة مختلفة من البيانات من نفس الـ Backend، فإن GraphQL تمنح كل عميل المرونة ليطلب ما يحتاجه فقط.
  • بنية الخدمات المصغرة (Microservices): يمكن استخدام GraphQL كـ “بوابة API” (API Gateway) تتخاطب مع عدة خدمات مصغرة خلف الكواليس، وتجمع البيانات منها، وتقدمها للعميل في استجابة واحدة متماسكة. هذا يخفي تعقيد الـ Backend عن الواجهات الأمامية.

متى قد يكون REST API هو “صاحبك” المفضل؟

  • الـ APIs البسيطة جداً: إذا كنت تبني خدمة صغيرة جداً مع عمليات CRUD بسيطة (مثل مدونة شخصية بسيطة)، قد يكون بناء REST API أسرع وأسهل.
  • التعامل مع الملفات: عمليات رفع وتحميل الملفات غالباً ما تكون أبسط وأكثر مباشرة باستخدام REST API التقليدي.
  • التخزين المؤقت (Caching): الـ Caching على مستوى HTTP مع REST (باستخدام ETag و Cache-Control) ناضج جداً وسهل التطبيق. التخزين المؤقت في GraphQL يتطلب استراتيجيات مختلفة وأحياناً أكثر تعقيداً.

الخلاصة: مش مجرد موضة، بل ضرورة! ✅

في النهاية، قصة تطبيقي البطيء علمتني أن طريقة طلبنا للبيانات لا تقل أهمية عن البيانات نفسها. GraphQL لم تكن مجرد “موضة” تقنية عابرة بالنسبة لي، بل كانت حلاً جذرياً لمشكلة حقيقية ومؤلمة: عدم كفاءة نقل البيانات بين الخادم والعميل.

التحول إلى GraphQL أنقذ المشروع، وحسّن أداء التطبيق بشكل جذري، وجعل تجربة المستخدم أفضل بكثير. كما أنه جعل حياتي كمطور أسهل، فلم أعد بحاجة للرجوع لفريق الـ Backend كلما احتجت حقلاً جديداً أو أردت إزالة حقل قديم.

نصيحتي الأخيرة لك: لا تتبع التقنية لمجرد أنها جديدة. افهم المشكلة التي تواجهها أولاً. إذا كانت مشكلتك هي الـ Over-fetching، أو الـ Under-fetching، أو الحاجة لمرونة عالية في الواجهات الأمامية، فصدقني، GraphQL تستحق التجربة. جرّبها، ومش راح تندم!

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

اختبارات الاداء والجودة

اختبارات التكامل قتلت إنتاجيتي: كيف أنقذني ‘اختبار العقود’ من جحيم انتظار الفرق الأخرى

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

2 مارس، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

سيرتي الذاتية عبرت فلتر الـ ATS لكنها فشلت أمام المدير التقني: كيف أعدت بناءها لتتحدث لغة المهندسين؟

من واقع تجربة شخصية، أسرد لك كيف تحوّل سيرتك الذاتية من مجرد قائمة مهارات يتجاهلها المديرون التقنيون إلى قصة إنجازات مُقنعة تفتح لك أبواب المقابلات....

28 فبراير، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

خدمة واحدة فاشلة كادت أن تسقط النظام بأكمله: كيف أنقذني نمط ‘قاطع الدائرة’ (Circuit Breaker) من كارثة متتالية؟

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

27 فبراير، 2026 قراءة المزيد
البودكاست