يعد الأداء أحد أهم الجوانب التي يجب أخذها في الاعتبار عند تطوير تطبيقات الويب. يعد تحليل كيفية جلب البيانات من قاعدة البيانات نقطة انطلاق جيدة عند البحث عن التحسينات. ستجد في هذه المقالة أمثلة على كيفية تحسين الأداء باستخدام الدوال المجمعة وتصفية البيانات على مستوى قاعدة البيانات.
بعض السياق لنبدأ بـ
هذا المقال مستوحى من مشكلة حقيقية واجهتها ذات مرة. وقد علمني التعامل معها الكثير، وما زلت أحتفظ بها كمرجع في ذهني. أعتقد أن الأمثلة هي مورد تعليمي جيد، ويمكنها توضيح الكثير. في هذه المقالة، أود أن أشارككم بعض الأمثلة على استخدام طرق الاستعلام عن السجل النشط.
من أجل عدم تقديم تفاصيل خاصة بالمجال، سأستخدم نموذج تطبيق لمكتبة لتوضيح الأمثلة. كل شيء بسيط إلى حد ما، كما هو موضح في الرسم البياني أدناه. لدينا أربعة جداول: المؤلفون والكتب والمستخدمون والإيجارات. يمكن لمستخدم واحد استعارة العديد من الكتب ويمكن استعارة كتاب واحد من قبل العديد من المستخدمين، لذلك نحن بحاجة إلى جدول ربط لتمثيل العلاقات بين العديد من المستخدمين. إنه جدول الإيجارات في حالتنا. نقوم أيضًا بتخزين بعض المعلومات الإضافية هناك، وهي تواريخ الاستعارة والإرجاع. يمكن أن يكون للمؤلف العديد من الكتب المعينة باسمه. يحتوي الكتاب أيضًا على سمة تحدد نوعه.
إحصائيات قراءة المستخدم
كانت المهمة هي إعداد إحصائيات لمستخدم واحد، حتى نتمكن من معرفة عدد الكتب من كل نوع تمت استعارته. كانت فكرتي الأولى هي جلب جميع الكتب التي استعارها المستخدم، وتجميعها حسب نوعها، ثم القيام بالتخطيط، بحيث يكون لكل نوع عدد من الكتب المخصصة بدلاً من قائمة. هذا ما توصلت إليه:
في حين أن هذا النهج يعمل ويبدو نظيفًا، إلا أنه لا يستخدم جميع الإمكانيات التي توفرها طرق الاستعلام عن السجل النشط. بفضلها يمكننا تصفية البيانات وتجميعها على مستوى قاعدة البيانات دون استخدام SQL الخام مباشرةً في الكود. كما أن العمل على مستوى db يزيد من كفاءتنا.
في المثال أعلاه، يمكننا استخدام طريقة التجميع بدلاً من مجموعة روبيحسب الطريقة. سيتم تطبيق المجموعةبند BY إلى استعلام tSQL. علاوة على ذلك، يمكن استبدال طريقة التعيين والحجم بدالة تجميع العد. في النهاية، يتبقى لدينا استعلام يبدو كالتالي:
Book.joins.joins(:rentals).where(rentals: { user: user }).group(:kindre).count(:books)
يبدو الأمر أكثر بساطة!
أمثلة أخرى مفيدة
ستجد أدناه بعض الطرق الأخرى لاستخدام طرق الاستعلام التي أرى أنها تستحق المعرفة.
دعوة للمستخدمين غير النشطين
المهمة: تصفية المستخدمين الذين لم يسبق لهم استعارة كتاب أو قاموا بذلك منذ أكثر من عام.
يمكننا جلب جميع المستخدمين من خلال تضمين الإيجارات المرتبطة ثم تصفيتها باستخدام طريقة التحديد.
المستخدم.includes(:rentals).select do |user|
| user.rentals.empty? | | user|.rentals.none? { | | ||إيجار|||تاريخ_البدء_التأجير >= Date.today - 1.year }
نهاية
ولكن، بالطبع، ليست هناك حاجة لجلب كل شيء. باستخدام طرق الاستعلام، يمكننا تصفيتها على مستوى قاعدة البيانات. أولاً، دعنا نختار المستخدمين الذين استعاروا بعض الكتب في العام الماضي ثم نستبعدهم من التحديد النهائي.
من المهم أن تتذكر شيئًا واحدًا أثناء استخدام الوصلات اليسرى (والوصلات الخارجية بشكل عام). إذا كانت هناك سجلات في الجدول الأيسر (هنا: المؤلفون) ليس لها سجلات مقابلة في الجدول الأيمن (هنا: الكتب)، فسيتم ملء أعمدة الجدول الأيمن بقيم لا شيء.
نظرًا لأننا نحتاج أيضًا إلى مؤلفين مع تعيين كتاب واحد في النظام، فهناك بعض العمليات الأخرى التي يجب القيام بها. سيتعين علينا القيام بالتجميع والعد وإضافة شرط. إليك كيفية وضع كل ذلك معًا:
يأتي الشرط بعد دالة التجميع، لذا علينا استخدام جملة HAVING، بدلًا من جملة WHERE لتحديده.
تستحق طرق الاستعلام عن السجل النشط التحقق منها عند التفكير في أداء التطبيق. يمكنها تبسيط الشيفرة الخاصة بك وجعلها تعمل بشكل أسرع. آمل أن تساعدك الأمثلة المشتركة في استكشاف الإمكانيات التي تقدمها طرق الاستعلام.