Перейти к содержимому
TelegramGitHub

Установка

Нужны две вещи: DuckDB и учебные файлы.

Работаем в терминале. Если он незнаком, пройдите курс CLI.

Если DuckDB уже стоит после курса SQL, пропустите шаг. Проверьте:

Окно терминала
duckdb --version

Нужна версия 1.1 или новее. Если DuckDB нет, установите:

Окно терминала
brew install duckdb

Подробнее — в установке из курса SQL.

Окно терминала
cd ~
curl -L -o modeling-practice.tar.gz https://dataengineer.ru/assets/practice/modeling-practice.tar.gz
tar xzf modeling-practice.tar.gz
cd modeling-practice
ls data

Проверка: ls data показывает девять файлов:

categories.csv customers.csv order_items.csv products.csv stores.csv
customer_changes.csv inventory.csv orders.csv returns.csv

Это выгрузка из OLTP-базы магазина спортивных товаров «Волна». Период: январь–июнь 2025. У магазина есть онлайн-магазин и три точки: Москва, Санкт-Петербург, Казань.

Данные учебные. Мы их сгенерировали, но сделали похожими на настоящие: есть гости без карты, отменённые заказы, рост цен в апреле и переезды клиентов.

ФайлСтрокЧто внутри
categories.csv5Категории товаров
products.csv20Товары: SKU, бренд, категория, текущая цена
stores.csv4Магазины: город, регион, тип (online / offline)
customers.csv300Клиенты на 1 января 2025: город, сегмент
customer_changes.csv30Журнал изменений клиентов: переезды и переход в VIP
orders.csv2000Заказы (шапка): клиент, магазин, даты, статус, доставка
order_items.csv3501Позиции заказов: товар, количество, цена, скидка
inventory.csv2370Остаток товара в магазине на конец каждого дня июня
returns.csv216Возвраты товаров (для итоговой практики)

Так выглядит схема источника. Это нормализованная модель (3NF): каждая сущность — в своей таблице.

ER-диаграмма источника: categories, products, orders, order_items, customers, customer_changes и stores, связанные внешними ключами

Откройте базу modeling.duckdb (файл создастся сам):

Окно терминала
duckdb modeling.duckdb

Источник кладём в отдельную схему src. Так сырые таблицы не смешаются с моделью, которую мы построим.

CREATE SCHEMA IF NOT EXISTS src;
CREATE OR REPLACE TABLE src.categories AS SELECT * FROM 'data/categories.csv';
CREATE OR REPLACE TABLE src.products AS SELECT * FROM 'data/products.csv';
CREATE OR REPLACE TABLE src.stores AS SELECT * FROM 'data/stores.csv';
CREATE OR REPLACE TABLE src.customers AS SELECT * FROM 'data/customers.csv';
CREATE OR REPLACE TABLE src.customer_changes AS SELECT * FROM 'data/customer_changes.csv';
CREATE OR REPLACE TABLE src.orders AS SELECT * FROM 'data/orders.csv';
CREATE OR REPLACE TABLE src.order_items AS SELECT * FROM 'data/order_items.csv';
CREATE OR REPLACE TABLE src.inventory AS SELECT * FROM 'data/inventory.csv';
CREATE OR REPLACE TABLE src.returns AS SELECT * FROM 'data/returns.csv';

Проверьте, что всё загрузилось:

SELECT table_name, estimated_size AS rows
FROM duckdb_tables()
WHERE schema_name = 'src'
ORDER BY table_name;

Проверка: девять таблиц, число строк совпадает с таблицей выше.

Посмотрите на заказы:

SELECT * FROM src.orders LIMIT 5;

Таблицы остаются в файле modeling.duckdb. В следующий раз просто откройте его: duckdb modeling.duckdb. Запускайте DuckDB всегда из папки modeling-practice. Выйти: .exit.

  • No files found that match the pattern "data/...". Вы не в папке modeling-practice. Выйдите (.exit), выполните cd ~/modeling-practice и откройте базу снова.
  • Could not set lock on file. База открыта в другом окне. Закройте его.
  • Русские буквы выглядят как ??? (Windows). Выполните chcp 65001 в терминале перед запуском DuckDB.

Дальше: OLTP и OLAP: зачем моделировать.