Learnly
SQL для аналитиков/Глава 3/Урок 2

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

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

Данные редко хранятся в одной таблице. Обычно их несколько, и они связаны. Это главная идея реляционных баз.

Почему несколько таблиц?

Представь хранение заказов с информацией о покупателе в одной таблице:

orders (плохо)
+---------+---------+---------------+------------------+
| orderId | product | customerName  | customerEmail    |
+---------+---------+---------------+------------------+
|       1 | Ноутбук | Алекс Иванов  | alex@example.com |
|       2 | Мышь    | Алекс Иванов  | alex@example.com |  <- повтор!
+---------+---------+---------------+------------------+

Алекс сделал два заказа, его данные дублируются. Если он сменит email, надо обновить несколько строк. Опасно.

Правильно, разделить:

customers                    orders
+----+--------------+         +---------+------------+---------+
| id | name         |         | orderId | customerId | product |
+----+--------------+         +---------+------------+---------+
|  1 | Алекс Иванов |         |       1 |          1 | Ноутбук |
|  2 | Мария Петрова|         |       2 |          1 | Мышь    |
+----+--------------+         +---------+------------+---------+

Данные об Алексе, только один раз.

Первичный ключ (Primary Key)

Столбец id, первичный ключ. Уникально идентифицирует каждую строку.

Правила: уникальный, не NULL, неизменяемый. Обычно автоинкрементное число.

Внешний ключ (Foreign Key)

В таблице orders столбец customerId, внешний ключ. Он ссылается на id таблицы customers.

Это и есть связь. База следит: нельзя создать заказ с customerId = 99 если такого покупателя нет.

Типы связей

Один ко многим (1:N), один покупатель, много заказов. Самая частая.

Один к одному (1:1), один пользователь, один профиль.

Многие ко многим (M:N), один заказ содержит много товаров, один товар в много заказов. Через промежуточную таблицу.

💡 Главная мысль: Данные разбиваются по таблицам чтобы не повторяться. Связь, через ключи. Для получения данных из нескольких таблиц используем JOIN.