Перейти до вмісту

Датасет «Крамниця»

«Крамниця» — вигаданий український маркетплейс. Покупці замовляють товари продавців і забирають їх у пунктах видачі, пишуть відгуки, переглядають сторінки товарів, стежать за продавцями й дружать між собою. Області й населені пункти справжні, з GeoNames (CC BY 4.0), усе інше згенеровано програмою.

На цих самих даних працюють пісочниця, приклади в модулях і всі дванадцять лабораторних. Тож таблиці й колонки, які ви бачите в модулі 3, будуть тими самими й у модулі 19.

Таблиця Що це Звʼязки
regions області, АР Крим, Київ і Севастополь 1 : N settlements
settlements населені пункти з населенням і координатами N : 1 regions; 1 : N pickup_points, customers, sellers
pickup_points відділення й поштомати трьох перевізників N : 1 settlements; 1 : N orders
categories дерево категорій до чотирьох рівнів parent_id посилається на categories
customers покупці N : 1 settlements; 1 : N orders, reviews
sellers продавці: ТОВ, ФОП, приватні особи N : 1 settlements; 1 : N products
products товари, price numeric, attributes jsonb N : 1 sellers, categories
inventory залишки, один рядок на товар 1 : 1 products
orders замовлення з доставкою в пункт видачі N : 1 customers, pickup_points
order_items позиції замовлень, ціна на момент покупки N : 1 orders, products
payments спроби оплати: може бути кілька або жодної N : 1 orders
shipments відправлення 1 : 1 orders
reviews відгуки з оцінкою від 1 до 5 N : 1 products, customers, orders
view_events перегляди, додавання в кошик і в список бажань N : 1 products, customers
seller_follows покупець стежить за продавцем N : M customers і sellers
customer_friends пари друзів, кожна один раз N : M customers із собою

Час у датасеті записано в UTC. Індексів, крім первинних ключів, немає навмисно: їх додаєте ви, і тоді в планах запитів видно різницю.

Той самий генератор робить датасет трьох розмірів. Таблиці, колонки й характер даних однакові, різниться лише кількість рядків і період, який вони охоплюють.

Розмір Усього рядків Замовлень Товарів Період У PostgreSQL
small 193 тис. 22 030 3 500 2025 рік 32 МБ
medium 1,9 млн 220 528 35 000 2024–2025 240 МБ
full 19,3 млн 2 009 466 200 000 2023–2025 2,2 ГБ

Навіщо три, а не один. Малий розмір швидко вантажиться й поміщається в браузер, але на ньому не видно найцікавішого: таблиця з трьома тисячами товарів читається цілком за мілісекунди, і індекс майже нічого не дає. На десятикратно більшому medium різниця між повним скануванням і індексом уже очевидна, а ноутбук із ним справляється. full потрібен рідко: там, де ефект проявляється лише на мільйонах рядків, як-от у великих агрегаціях.

small стоїть у пісочниці на сторінках курсу й завантажується сам, коли ви вперше піднімаєте PostgreSQL для лабораторних. На ньому працює більшість прикладів і завдань.

medium потрібен у модулях і лабораторних про індекси, плани й продуктивність (модулі 7–9, лабораторні L2, L4, L11). Генерується на вашій машині за кілька секунд.

full необовʼязковий. Деякі числа в модулях виміряно на ньому, щоб показати масштаб, але відтворювати їх не обовʼязково.

Коли модуль наводить число з датасету, поруч сказано, з якого розміру воно взяте: «на medium BRIN-індекс займає 24 КіБ», «у small 44 товари без категорії». Якщо розмір не названо, мова про small.

Тому ваші результати можуть відрізнятися від тексту. Пісочниця завжди працює на small, і запит, який у модулі виміряно на medium, у ній поверне менші числа, а план може бути інакшим. Час виконання ще й залежить від машини: модулі наводять його для орієнтиру, а важить співвідношення, наприклад «з індексом у сто разів швидше». Службові номери, як-от xmin чи ctid, у кожного свої.

У файлах для лабораторних є скрипти, які генерують датасет і завантажують його в базу:

Terminal window
./setup/generate-dataset.sh medium
./setup/load-dataset.sh medium --reset

Для full те саме з full замість medium: генерація триває близько хвилини, а на диску знадобиться до 12 ГБ. Звідки взяти ці файли й як підняти базу, описано на сторінці Лабораторні.

Генератор детермінований: той самий розмір дає ті самі рядки на будь-якій машині. Тому числа з модулів можна відтворити точно, а чекери лабораторних знають правильні відповіді.

Дані не ідеально чисті, бо справжні такими не бувають, і на цьому побудовано частину завдань. Наприклад, у small:

  • 44 товари без категорії, серед них популярний ноутбук, тож звіт виручки через INNER JOIN з categories мовчки губить найприбутковіший товар;
  • NULL у необовʼязкових полях: дата народження, промокод, текст відгуку;
  • 21 група покупців з однаковим email, що різниться лише регістром (імпорт зі старої платформи);
  • замовлення без жодного платежу і з кількома платежами;
  • ціна в замовленні, яка не збігається з поточною ціною товару;
  • закриті пункти видачі й видалені облікові записи.

Повний перелік із кількостями лежить у dataset/README.md у файлах для лабораторних.