GraphQL / المتوسط: السياسة والمصادر والعملاء / الدرس 8
التصفح بالمؤشر والترتيب الثابت
صمم قوائم محدودة بترتيب حتمي ونطاق مؤشر صريح وبيانات متابعة مفيدة.
في هذه الصفحة
أهداف الدرس
- اشرح مفاضلة المؤشر والإزاحة دون ادعاء لقطة ثابتة.
- اختبر صفحة مفاتيح صغيرة بمعرف يفصل التعادل.
عامل التصفح كعقد صحة
يحدد حقل القائمة حد الحجم والترتيب والتصفية والمتابعة. الإزاحة بسيطة للمجموعات الصغيرة الثابتة لكن الإضافة والحذف يغيران المواضع. يحدد المؤشر حد متابعة وفق ترتيب معلن لا عدد صفوف فقط. لا يعطي أي منهما لقطة ثابتة تلقائياً. حدد هل المطلوب موجز مباشر أو تقرير قابل للتكرار أو تصفح تقريبي، ومنها يقرر الاحتياج لنسخة أو لقطة.
اعرض العناصر والمتابعة منفصلين
يمكن لنمط الاتصال وضع المؤشر على الحواف وحالة المتابعة في pageInfo. هو عرف شائع لا شكل إلزامي لكل قائمة. يفترض المثال تقييد first بنطاق معتمد وتعريف after مؤشراً معتماً. لا يسمح first: 2 بقوائم علاقات غير محدودة داخل كل عنصر. وإذا أضيف totalCount فراجع كلفته وتفويضه؛ فقد يهيمن حساب دقيق على مصدر كبير على كلفة الصفحة الصغيرة.
query Browse($after: String) {
courses(first: 2, after: $after) {
edges { cursor node { id title } }
pageInfo { endCursor hasNextPage }
}
}
يحفظ العميل endCursor لسياق التصفية والترتيب نفسه ويتابع عند hasNextPage وفق عقد الخدمة.
اختر ترتيباً كلياً وحدد نطاق المؤشر
لا يكفي ترتيب بطابع زمني غير فريد لأن سجلات تشترك فيه. أضف معرفاً فريداً مستقراً ورمز حد المتابعة للقيمتين. يجب انتماء المؤشر للتصفية والمستأجر وإصدار الترتيب؛ فخلط النطاق قد يتخطى سجلات أو يكشف معلومات. ليست base64 تشفيراً أو توثيقاً. تحقق من البنية والحدود واستخدم سلامة موثقة إن وجب منع العبث.
نمذج الحد والعنصر الإضافي
يرتب المثال المحلي الأزواج بحسب الزمن ثم المعرف. يستعمل حجم الصفحة وزيادة واحد لمعرفة المتابعة، فيعيد اثنين ويستدل بالثالث. على موائم حقيقي فرض الحدود في المصدر لا جلب الجدول كله. المقارنة أكبر من الحد السابق فتمنع تكراره. يفحص النموذج الترتيب فقط لا تحديثات قاعدة متزامنة أو عزل معاملات.
const rows = [[10,"c1"],[10,"c2"],[11,"c3"],[12,"c4"]];
const after = [10,"c1"];
const eligible = rows.filter(([t,id]) =>
t > after[0] || (t === after[0] && id > after[1]));
const size = 2;
const window = eligible.slice(0, size + 1);
const page = window.slice(0, size);
console.assert(JSON.stringify(page) === JSON.stringify([[10,"c2"],[11,"c3"]]));
console.assert(window.length > size);
تتضمن الصفحة c2 وc3 ويثبت c4 الإضافي المتابعة للعينة الثابتة دون تشغيل مصدر.
وثق السلوك عند الإضافة والحذف
لا يجمد المؤشر المجموعة. قد لا يظهر إدراج قبل الحد في جلسة أمامية وقد يقصر الحذف الصفحة. للتقرير القابل للتدقيق استخدم لقطة مصدر أو مهمة تصدير مستقرة بدلاً من وعد المؤشر وحده. اختبر الفراغ وتعادل المفاتيح والصفحة الأخيرة وتغير المرشحات والمؤشر المعيب. افصل حدود الحجم عن راحة العميل واحسب تفرع القوائم المتداخلة.
الأخطاء الشائعة وإصلاحها
تتكرر سجلات عند تعادل الزمن
- لماذا يحدث؟
- أغفل الترتيب فاصلاً فريداً.
- كيف تصلحه؟
- رتب وتابع بالزمن والمعرف.
- كيف تتجنب تكراره؟
- اختبر سجلات تتشارك قيمة الترتيب.
يعاد استعمال مؤشر بتصفية مختلفة
- لماذا يحدث؟
- لم يتحقق من نطاقه.
- كيف تصلحه؟
- ارفض غير المتوافق بسياسة خطأ موثقة.
- كيف تتجنب تكراره؟
- أصدر الصيغة واربط سياق التصفية والترتيب.
تسبب first صغيرة عملاً ضخماً
- لماذا يحدث؟
- أهملت تفرعات القوائم وكلفة العد.
- كيف تصلحه؟
- قيد الحقول المتداخلة واضبط التعقيد الواقعي.
- كيف تتجنب تكراره؟
- راجع العمليات الموسعة بحدود الوسائط.
اختبر فهمك
1. لماذا يخاطر الترتيب بـupdatedAt وحده بتخطي عناصر؟
اعرض الحل المشروح
قد تتشارك عناصر زمن الحد؛ تتخطى المقارنة الصارمة المتبقي والمتساوية تعيد السابق. أضف معرفاً فاصلاً وقارن الزوج كله. حدث المؤشر وترتيب المصدر معاً واختبر حداً بين عناصر متعادلة.
2. هل يجعل المؤشر تصديراً متعدد الصفحات قابلاً للتكرار مع تعديلات متزامنة؟
اعرض الحل المشروح
لا، يسجل حد متابعة لا مجموعة مجمدة. قد تنقل التعديلات السجلات أو تغير أهليتها. يحتاج التقرير لقطة أو نسخة أو تصديراً بسياسة حفظ وإكمال معلنة. لا تستنتج ذلك من endCursor.
أهم ما تعلمته
- يحتاج المؤشر ترتيباً ثابتاً ونطاقاً صحيحاً وتفرعاً محدوداً.
- المتابعة وثبات اللقطة وعدان مختلفان.