После босса «Экономика Пограничья» агентство «Северный Тракт» берёт второго клиента: интернет-магазин настольных игр «Кубик». Вопросы задаёт Мира, маркетолог, данные лежат в базе boardshop. Договор с «Кубиком» пока пробный: Мира продлит его, если весной поверит нашему годовому отчёту, а один раз её уже подвели. В Пограничье мы почти всё считали внутри одной таблицы. В магазине так не выйдет: заказ, клиент и игра живут в разных таблицах, и ответ Мире начинается с того, чтобы понять, как они связаны. Заодно проверим, прав ли Ким.
Номер вместо имени
Представь картотеку библиотеки. На карточке читателя не переписывают названия всех взятых книг. Там стоят номера: «взял книгу 1734». Чтобы узнать название, идёшь в каталог и ищешь карточку книги с этим номером. Так экономят бумагу, и если книгу переименуют, исправить нужно одну карточку, а не тысячу.
База устроена так же. Посмотри на первые заказы:
SELECT * FROM orders ORDER BY id LIMIT 3;
id | customer_id | promo_code_id | status | created_at
----+-------------+---------------+-----------+------------------------
1 | 2 | NULL | delivered | 2025-01-01 11:27:36+00
2 | 6 | 11 | delivered | 2025-01-02 10:09:56+00
3 | 7 | NULL | delivered | 2025-01-02 10:10:52+00
Вместо имени клиента стоит customer_id. Это номер строки в таблице customers, как номер книги на карточке читателя.
Первичный и внешний ключ
У каждой строки customers есть уникальный номер id. Столбец, который однозначно определяет строку, называется первичным ключом. Двух клиентов с одним id быть не может, и NULL там тоже не бывает.
А orders.customer_id это внешний ключ: он ссылается на первичный ключ чужой таблицы. База следит за этой ссылкой: записать в заказ клиента №999999, которого нет, не получится.
Где ключи, видно во вкладке «Структура» песочницы: первичный ключ отмечен, а внешние ключи перечислены отдельным списком со стрелкой на целевую таблицу. В «Кубике» семь таблиц:
| Таблица | Что в строке | Первичный ключ | Внешние ключи |
|---|---|---|---|
customers | клиент | id | |
products | игра | id | base_id → products |
promo_codes | промокод | id | |
orders | заказ | id | customer_id → customers, promo_code_id → promo_codes |
order_items | игра в заказе | (order_id, product_id) | order_id → orders, product_id → products |
deliveries | попытка доставки | id | order_id → orders |
returns | возврат игры | id | order_id → orders, product_id → products |
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.