aggregate vs annotage

Biz Django-da queryset ustida qo’shimcha hisob-kitob va guruhlashlarni bajarish uchun annotate va aggregate methodlaridan foydalanamiz. Bu postda biz sizlar bilan ularni qanday va qay hollarda ishlatishni ko’rib chiqamiz.

Annotate methodi:

Bu method queryset yangi maydon (field) qo’shadi. Buni biz ko’pincha hisoblashda ishlatamiz. Misol uchun siz OnlineShop loyihangiz bor va Siz har bir foydalanuvchi (user) shu kungacha qancha mahsulotga order berganini hisoblamoqchisiz.

from django.db.models import Count
User.objects.annotate(total_orders=Count('orders'))

Bu yerda har bir foydalanuvchiga (User) tegishli orders maydoni asosida total_orders nomli yangi maydon qo'shiladi. Bu maydon har bir foydalanuvchining qancha buyurtma qilganini ko'rsatadi.

Yana bir misol: Agar foydalanuvchi tomonidan buyurtma qilingan mahsulotlar sonini hisoblashni xohlasangiz:

User.objects.annotate(total_products=Count('orders__products'))

Bu misolda har bir foydalanuvchi uchun jami mahsulotlar soni hisoblab beriladi, ya'ni foydalanuvchining qancha turli mahsulotlarga buyurtma bergani ko'rsatiladi.

annotate ko'p hollarda statistik hisobotlar yoki guruhlashlar kerak bo'lganda ishlatiladi, va natija har bir ob'ektga individual ravishda hisoblangan qo'shimcha maydon sifatida qaytariladi.

Aggregate metodi:

Bu metodni umumiy hisob-kitoblar, masalan: o‘rtacha qiymat, umumiy miqdor yoki maksimal/minimal qiymatlarni olish uchun ishlatamiz. aggregate bilan ishlaganda biz butun queryset o'rniga bitta umumiy qiymatni olamiz. Agar sizga har bir Product-ga qo’yilgan reytinglarning o'rtacha qiymatini olmoqchi bo’lsangiz, buni aggregate yordamida amalga oshirish mumkin.

from django.db.models import Avg
Rate.objects.filter(product_id=pk).aggregate(average_rating=Avg("rate"))

Bu yerda:

  • Rate modeli mahsulotlarga qo’yilgan reytinglarni o’z ichiga oladi.
  • filter(product_id=pk) mahsulotni product_id orqali filterlaydi. Ahir bizga har bir mahsulotga qo’yilgan umumiy raytning o’rta qiymati kerak. Shuning uchun biz pk mahsulotning unique adresini beryabmiz.
  • aggregate(average_rating=Avg("rate")) o'sha mahsulotga tegishli reytinglarning o'rtacha qiymatini hisoblab, natijani average_rating maydoni sifatida qaytaradi.

Keling endi bu methodlarning ish samaradorligi (Performance) qanday ekanligini ko’rib chiqamiz.

  • annotate: Bu method ba'zida katta ma'lumotlar bazasida sekin ishlashi mumkin, ayniqsa ko'p miqdordagi guruhlashlar yoki hisobotlar kerak bo'lsa. annotate ko'p hollarda SQL-ning GROUP BY buyrug'idan foydalanadi, bu esa katta miqdordagi ma'lumotlarda resurslarni ko'p talab qilishi mumkin. Shuning uchun kerak bo'lmagan joylarda foydalanmaslik yoki indekslardan foydalanib optimal qilish kerak.
  • aggregate: Katta ma'lumotlar ustida ishlaganda ham tezroq ishlaydi, chunki bu faqat bitta natijani qaytaradi. Shunga qaramay, katta hajmdagi ma'lumotlar bilan ishlaganda har doim ma'lumotlar bazasi optimizatsiyasiga e'tibor berish kerak.

Xulosa:

Yuqoridagi metodlar bilan ishlaganda to'g'ri indekslarni qo'llash va ma'lumotlar bazasini optimallashtirish katta ma'lumotlar ustida ishlash tezligini sezilarli darajada yaxshilaydi.

Agar katta hajmdagi ma'lumotlar bilan ishlayotgan bo'lsangiz, iloji boricha annotate va aggregate larni iloji boricha qisqartiring yoki ularni muvofiq bo'laklarga bo'lib ishlang.

Ko’proq ma’lumot olish uchun 🌐 Telegram kanalga a’zo bo‘ling