Модуль 31

Фільтрація, пагінація та пошук

Ось готовий урок, створений у стилі CS50: енергійний, зрозумілий та орієнтований на практику.


🎓 Урок CS50: Приборкання хаосу — Фільтрація, Пагінація та Пошук

Привіт, друзі! 👋 Це CS50.

Сьогодні ми поговоримо про те, як не потонути в океан і даних. Ми розберемо три стовпи, на яких тримається будь-який зручний інтерфейс: Фільтрацію, Пагінацію та Пошук.


1. 🔥 Вступ: Уявіть, що Google зламався...

Уявіть собі ситуацію. Ви заходите на сайт Amazon або Rozetka, щоб купити нові кросівки. Ви натискаєте кнопку "Взуття", і...

Ваш браузер завмирає на 2 хвилини. ⏳ Потім на екрані з’являється список із 2 мільйонів пар взуття. Всі підряд: дитячі сандалі, зимові чоботи, ласти, кросівки... Все в одну купу. Вам потрібно проскролити 50 кілометрів вниз, щоб знайти свої "Nike Air".

Риторичне питання: Ви б користувалися таким сайтом? Звісно, ні. Ви б закрили вкладку через 5 секунд.

У чому проблема? Бази даних сучасних проєктів містять тисячі, мільйони, іноді мільярди записів. 1. Ми не можемо віддати користувачеві ВСЕ одразу (це вб’є і сервер, і браузер клієнта). 2. Користувачеві не потрібно ВСЕ. Йому потрібно те, що він шукає.

Ось тут на сцену виходять наші рятівники: * Фільтрація — щоб відсікти зайве. * Пошук — щоб знайти конкретне. * Пагінація — щоб подавати інформацію порціями.


2. 🧠 Теоретична база (Що там "під капотом"?)

Давайте розберемо це без складних формул, на прикладі величезної бібліотеки.

1. Фільтрація (Filtering) 🧹

Це процес відбору даних за чіткими критеріями. Це точне співпадіння або діапазон. * Аналогія: Ви кажете бібліотекарю: "Дайте мені тільки книги жанру 'Фантастика', видані після 2020 року". * Під капотом: Це ваша умова WHERE у базі даних. * category == 'shoes' * price < 100

2. Пошук (Searching) 🔍

Це складніше. Це спроба знайти "голку в копиці сіна" за текстом. * Аналогія: Ви не знаєте точної назви книги, але пам’ятаєте, що там було слово "Гаррі". * Під капотом: Комп'ютер сканує текст рядків, шукаючи збіги символів (часто ігноруючи регістр — великі чи малі літери). Це операції типу LIKE або CONTAINS.

3. Пагінація (Pagination) 📄

Це розбиття великого списку на сторінки. * Аналогія: Бібліотекар не вивалює перед вами 500 книг на стіл. Він каже: "Ось перші 10. Подивишся — приходь за наступними". * Ключові поняття: * Limit (Size): Скільки записів показати за один раз (наприклад, 10). * Offset: Скільки записів пропустити спочатку (щоб показати другу сторінку, треба пропустити перші 10).

❗️ Що треба запам'ятати залізно: Ніколи, чуєте, НІКОЛИ не повертайте клієнту весь список даних із бази без пагінації. Це "смертний гріх" бекенд-розробника.


3. 🧪 Приклади (Кодимо логіку)

Уявімо, що у нас є список товарів products. (Я буду використовувати псевдокод, схожий на Python/SQL, щоб ми фокусувалися на логіці, а не на дужках).

Приклад 1: Проста фільтрація

Клієнт хоче тільки червоні футболки.

# Вхідні дані: 1000 товарів
request = { "color": "red", "type": "t-shirt" }

# Логіка фільтрації
results = db.query("SELECT * FROM products WHERE color = 'red' AND type = 't-shirt'")

Результат: Ми отримали, скажімо, 50 футболок. Чистий, точний список.


Приклад 2: "Розумний" Пошук

Клієнт вводить у рядок пошуку: "iPhone". Але в базі записано: "Apple iPhone 13", "iphone case", "IPHONE charger".

Питання до вас: Якщо ми будемо шукати точне співпадіння (name == "iPhone"), що ми знайдемо? Правильно, нічого! Тому що "Apple iPhone 13" не дорівнює просто "iPhone".

search_term = "iPhone"

# Логіка пошуку (insensitive - нечутливо до регістру)
# ILIKE означає "шукай схоже, ігноруй великі/малі літери"
results = db.query(f"SELECT * FROM products WHERE name ILIKE '%{search_term}%'")

Результат: Знайдеться все, де є слово iphone, iPhone або IPHONE.


Приклад 3: Пагінація (Математика сторінок)

У нас є 100 товарів. Ми хочемо показати Сторінку 3, по 10 товарів на сторінці.

Як комп'ютер дізнається, які саме товари брати? Нам треба порахувати OFFSET (скільки пропустити).

Формула: OFFSET = (page_number - 1) * page_size

Давайте рахувати разом: * Сторінка 1: пропустити 0. (Показуємо 1-10) * Сторінка 2: пропустити 10. (Показуємо 11-20) * Сторінка 3: (3 - 1) * 10 = 20. Пропустити 20. (Показуємо 21-30)

SELECT * FROM products
LIMIT 10
OFFSET 20

Чому це круто? База даних навіть не читає решту 70 товарів. Вона економить сили!


4. 🛠 Практична частина

Час розім'яти мізки! 🧠 У вас є масив даних users (користувачі).

Завдання 1: Фільтр-контроль 👮‍♂️

У вас є список користувачів з полями age (вік) та status (active/banned). Напишіть (словами або псевдокодом) умову, щоб отримати повнолітніх активних користувачів.

Завдання 2: "Дедлайн горить" 🔥

Користувач шукає задачу за словом "bug". У базі є задачі: 1. "Fix login bug" 2. "Buy burger" 3. "DEBUGGING session" Які з цих задач знайде звичайний пошук (substring match), а які — ні? Чому "burger" може потрапити у видачу?

Завдання 3: Калькулятор пагінації 🧮

Ви робите блог. На одній сторінці — 5 статей. Користувач хоче відкрити Сторінку 4. Який буде LIMIT? Який буде OFFSET?

Завдання 4: Міні-кейс (Реальна проблема) 🕵️

Ви зробили пагінацію. * Клієнт відкриває сторінку 1 і бачить користувача "Олег". * Клієнт відкриває сторінку 2 і... знову бачить "Олег"! Питання: Як таке могло статися? Чого ми не зробили перед пагінацією? (Підказка: в якому порядку лежать книги в бібліотеці?)


5. 💡 Мислення як у розробника

Як відрізнити новачка від профі в цій темі?

❌ Помилка новачка: "Фільтрація в пам'яті"

Новачок робить так: 1. Завантажує з бази ВСІ 100 000 товарів у пам'ять програми. 2. Циклом for перебирає їх, щоб знайти 5 червоних. Наслідок: Серверу не вистачає RAM, програма падає.

✅ Як думає профі: "Фільтрація в базі"

Профі змушує базу даних робити брудну роботу. 1. Надсилає запит "Дай тільки червоні". 2. Отримує 5 записів. Наслідок: Швидко, економно.

💡 Професійна порада: "Сортування — найкращий друг пагінації"

Пам'ятаєте Завдання 4 про Олега? База даних не гарантує порядок видачі, якщо ви її не попросите. Якщо ви робите LIMIT/OFFSET, ви ЗАВЖДИ повинні додавати ORDER BY (сортувати), наприклад, за датою реєстрації або ID. Інакше ваші сторінки будуть "скакати".


6. 🧩 Підсумок

Отже, що ми сьогодні поклали в нашу скарбничку знань?

  1. Фільтрація — це сито. Вона прибирає непотрібне.
  2. Пошук — це детектив. Він знаходить приховане в тексті.
  3. Пагінація — це нарізка торта. Ніхто не їсть цілий торт за один укус (ну, майже ніхто 😉).
  4. Ми навчилися рахувати OFFSET і зрозуміли, чому порядок (Sorting) важливий.

Тепер ви можете створювати інтерфейси, які не "гальмують" навіть з мільйонами даних!

🔜 Тизер наступного уроку: Але що робити, якщо пошук по мільйону записів все одно займає 3 секунди, а клієнт хоче за 0.1 секунди? На наступному уроці ми дізнаємося про магію Індексів (Indexes). Це як закладки в книзі, які прискорюють пошук у 1000 разів!

До зустрічі! 👨‍💻