Раздел 42 · Аналитика данных с нуля

Ключи и связи между таблицами

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

После босса «Экономика Пограничья» агентство «Северный Тракт» берёт второго клиента: интернет-магазин настольных игр «Кубик». Вопросы задаёт Мира, маркетолог, данные лежат в базе 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играidbase_id → products
promo_codesпромокодid
ordersзаказidcustomer_id → customers, promo_code_id → promo_codes
order_itemsигра в заказе(order_id, product_id)order_id → orders, product_id → products
deliveriesпопытка доставкиidorder_id → orders
returnsвозврат игрыidorder_id → orders, product_id → products

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.