Ключи и связи между таблицами
Данные редко хранятся в одной таблице. Обычно их несколько, и они связаны. Это главная идея реляционных баз.
Почему несколько таблиц?
Представь хранение заказов с информацией о покупателе в одной таблице:
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.