Датасет «Крамниця»
«Крамниця» — вигаданий український маркетплейс. Покупці замовляють товари продавців і забирають їх у пунктах видачі, пишуть відгуки, переглядають сторінки товарів, стежать за продавцями й дружать між собою. Області й населені пункти справжні, з GeoNames (CC BY 4.0), усе інше згенеровано програмою.
На цих самих даних працюють пісочниця, приклади в модулях і всі дванадцять лабораторних. Тож таблиці й колонки, які ви бачите в модулі 3, будуть тими самими й у модулі 19.
Таблиці
Section titled “Таблиці”| Таблиця | Що це | Звʼязки |
|---|---|---|
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. Індексів, крім первинних ключів, немає навмисно: їх додаєте ви, і тоді в планах запитів видно різницю.
Три розміри
Section titled “Три розміри”Той самий генератор робить датасет трьох розмірів. Таблиці, колонки й характер даних однакові, різниться лише кількість рядків і період, який вони охоплюють.
| Розмір | Усього рядків | Замовлень | Товарів | Період | У 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 необовʼязковий. Деякі числа в модулях виміряно на ньому, щоб показати
масштаб, але відтворювати їх не обовʼязково.
Звідки числа в модулях
Section titled “Звідки числа в модулях”Коли модуль наводить число з датасету, поруч сказано, з якого розміру воно взяте:
«на medium BRIN-індекс займає 24 КіБ», «у small 44 товари без категорії». Якщо розмір
не названо, мова про small.
Тому ваші результати можуть відрізнятися від тексту. Пісочниця завжди працює на small,
і запит, який у модулі виміряно на medium, у ній поверне менші числа, а план може
бути інакшим. Час виконання ще й залежить від машини: модулі наводять його для
орієнтиру, а важить співвідношення, наприклад «з індексом у сто разів швидше».
Службові номери, як-от xmin чи ctid, у кожного свої.
Як отримати medium і full
Section titled “Як отримати medium і full”У файлах для лабораторних є скрипти, які генерують датасет і завантажують його в базу:
./setup/generate-dataset.sh medium./setup/load-dataset.sh medium --resetДля full те саме з full замість medium: генерація триває близько хвилини, а на
диску знадобиться до 12 ГБ. Звідки взяти ці файли й як підняти базу, описано на сторінці
Лабораторні.
Генератор детермінований: той самий розмір дає ті самі рядки на будь-якій машині. Тому числа з модулів можна відтворити точно, а чекери лабораторних знають правильні відповіді.
Що в даних навмисно
Section titled “Що в даних навмисно”Дані не ідеально чисті, бо справжні такими не бувають, і на цьому побудовано частину
завдань. Наприклад, у small:
- 44 товари без категорії, серед них популярний ноутбук, тож звіт виручки через
INNER JOINзcategoriesмовчки губить найприбутковіший товар; NULLу необовʼязкових полях: дата народження, промокод, текст відгуку;- 21 група покупців з однаковим email, що різниться лише регістром (імпорт зі старої платформи);
- замовлення без жодного платежу і з кількома платежами;
- ціна в замовленні, яка не збігається з поточною ціною товару;
- закриті пункти видачі й видалені облікові записи.
Повний перелік із кількостями лежить у dataset/README.md у файлах для лабораторних.