سؤال

أنا أبحث في مواقف في تطبيقات الويب الموجهة لقاعدة البيانات عندما يجب على المرء الاعتماد على فرز الجداول من جانب العميل بدلاً من الفرز من جانب الخادم.أحد المواقف المحددة التي تزعجني هو ترقيم الصفحات.

عند محاولة ترقيم جدول كبير (على سبيل المثال 10000 صف)، وكذلك فرزه حسب عمود معين، ما هو أفضل نهج يمكن اتباعه؟

أفهم أن بعض القضايا المتعلقة بهذا هي:

  • لا أستطيع إعادة الجدول بأكمله إلى جانب العميل دفعة واحدة
  • لا يمكنني فرز ما يصل إلى 10000 سجل باستخدام جافا سكريبت
  • فرز الجدول سيتضمن فرز الصفوف في كل الصفحات، وليس فقط الصفحة الحالية.

إذن هل لديك أي مشكلات أخرى تريد إضافتها إلى هذه القائمة؟

ما هو النهج الذي قد يؤدي إلى مزيج جيد من التفاعل من جانب العميل والخادم بحيث يتم تقليل تحميل الخادم إلى الحد الأدنى؟


إضافة:

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

الآن فكر في هذا:

المستخدم موجود في الصفحة (3 من 10) من الجدول مرتبة حسب الرقم التسلسلي.الآن ينقر المستخدم على الرأس المسمى "اسم المستخدم"، ويريد فرز الجدول حسب اسم المستخدم.

سؤال:هل يجب أن تكون النتيجة النهائية "صفحة (1 من 10) مرتبة حسب اسم المستخدم" أم يجب أن تكون "صفحة (3 من 10) مرتبة حسب اسم المستخدم"؟

أعلم أن هذا سؤال شخصي للغاية، ولكن بماذا توصي ولماذا؟

هل كانت مفيدة؟

المحلول

من الأفضل أن يظل جانب العميل بسيطًا:يتم استخدام الفرز/الترحيل في جافا سكريبت فقط لمجموعات النتائج الصغيرة جدًا - وهي صغيرة بما يكفي بحيث لا يلاحظ المستخدم نتيجة الأداء.

جانب الخادم هو المكان الذي يمكنك فيه تحسين تحميل الخادم:

يمكن أن يأتي التحميل في شكل طلبات متكررة لمزيد من الصفحات، وأعداد كبيرة من الصفوف/الأعمدة لكل صفحة، وطلبات متكررة للجوء.(لم نتحدث حتى عن التصفية)

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

  • بالنسبة لطلبات الصفحات المتكررة، فكر في جعل بعض طلبات Ajax تقوم بتحميل الصفحات القليلة التالية (والسابقة) مسبقًا، ثم قم بتبديل الصفوف (عبر Javascript) إلى الجدول بناءً على طلب المستخدم.

  • بالنسبة لأحجام الصفحات الكبيرة، فكر في الاحتفاظ بالصفوف في ذاكرة التخزين المؤقت للتطبيق (الذاكرة) "الأحدث استخدامًا"، بحيث لا يُطلب من قاعدة البيانات إخراج نفس الأجزاء الضخمة من البيانات مرارًا وتكرارًا.

  • بالنسبة لللجوء المتكرر، فإن الأسلوب الجيد هو الاحتفاظ بجدول ذاكرة التخزين المؤقت في SQL مع النتائج فقط.

ودائمًا، دائمًا، قم بفهرسة قاعدة البيانات بشكل مناسب.


رد إضافي:

ردي الشخصي للغاية هو هذا:يريد المستخدم (أنا) الفرز من صفحة عشوائية.دعهم (أنا).لا يوجد شيء أكثر إزعاجًا من أن تكون في المكان الذي تريد أن تكون فيه، ووجود تطبيق يعيدك إلى بداية القائمة.

وهناك اعتبار آخر هو مستويات متعددة من الفرز:هل تريد تنفيذ الفرز حسب الرقم التسلسلي، ثم اسم المستخدم؟ضع في اعتبارك ما يفعله Microsoft Excel، أو أي تطبيق آخر يعرفه المستخدمون.من المحتمل أن يكون المستخدمون لديك على ما يرام مع ما اعتادوا عليه - بما في ذلك إعادتهم إلى الصفحة 1.

نصائح أخرى

قواعد البيانات هي الوحوش الحقيقية في فرز البيانات واختيارها.لذا فإن أفضل رهان لك هو بالتأكيد أن يقول العميل للخادم ، "أريد الصفحة X مع صفوف Y التي تم فرزها بواسطة Z." ثم تقوم قاعدة البيانات بعملها ، ويظهر العميل النتيجة.لتحسين الأداء، يمكنك إنشاء نتائج ذاكرة التخزين المؤقت للعميل، علاوة على ذلك، يمكنك جعل الكود الخاص بك يطلب الصفحات التالية والسابقة بعد جلب الصفحة الحالية بحيث يمكن عرضها على الفور عند الطلب.

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

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

والأسلوب الأسوأ هو إجراء الفرز والترحيل باستخدام جافا سكريبت والذي بالطبع لا يوصى به على الإطلاق لأسباب واضحة.

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

إذا كنت ترغب في ذلك، اطلب من جانب العميل السماح بمزيد من الفرز الفرعي عبر جافا سكريبت، وما إلى ذلك إذا كانت البيانات مفصلة بما فيه الكفاية ويمكن الاستفادة منها. قد ترغب في تخزين ميزات الفرز الفرعي التي تم تحديدها حتى يتم تذكرها بين الصفحات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top