Зачем данные разбиты на таблицы
Зачем это нужно
Представь, что весь интернет-магазин хранится в одной Excel-таблице: имя клиента, его email, название товара, цена, категория, дата заказа — всё в одной строке. Звучит удобно? Но что произойдёт, если клиент сделает 50 заказов?
| Клиент | Email | Товар | Цена | Категория | Дата |
|----------------|-------------------|---------------|---------|--------------|------------|
| Алексей Смирнов| smirnov@mail.ru | iPhone 15 Pro | 89 990₽ | Электроника | 2024-01-03 |
| Алексей Смирнов| smirnov@mail.ru | Атомные прив. | 690₽ | Книги | 2024-01-10 |
| Алексей Смирнов| smirnov@mail.ru | Теннис. ракет.| 3 490₽ | Спорт | 2024-01-28 |
... (ещё 47 строк с одним и тем же именем и email)
Проблемы очевидны:
- Дублирование — email клиента повторяется в каждой строке
- Обновление — если клиент поменял email, нужно исправить 50 строк
- Ошибки — в одной строке опечатка в email → данные расходятся
- Размер — таблица раздувается без необходимости
Решение: нормализация
База данных разбивается на несколько таблиц. Каждая хранит один тип сущности:
customers → кто покупает (клиенты)
products → что продаём (товары)
categories → справочник категорий
orders → факт покупки (заказы)
order_items→ что именно купили (позиции заказа)
deliveries → как доставили (доставки)
Теперь email клиента хранится один раз в таблице customers. В таблице
orders — только ссылка на клиента: его id. Это и есть связь между таблицами.
Аналогия с Excel
В Excel это похоже на использование ВПР (VLOOKUP): в одном листе у вас заказы
с кодом клиента, в другом — справочник клиентов. ВПР подтягивает имя по коду.
В SQL то же самое делает JOIN — и делает это намного мощнее.
Как работают ссылки
customers orders
────────────────── ─────────────────────
id │ first_name │ email id │ customer_id │ total_amount
───┼────────────┼────── ───┼─────────────┼─────────────
1 │ Алексей │ smir@… 1 │ 1 │ 89 990₽
2 │ Мария │ ivan@… 2 │ 2 │ 2 570₽
3 │ Дмитрий │ kozl@… 3 │ 1 │ 22 990₽
4 │ 1 │ 2 610₽
Заказы 1, 3 и 4 принадлежат клиенту с id=1 (Алексею). Его данные хранятся
один раз — в customers.
Частые ошибки
- «Зачем столько таблиц, было бы проще одной» — удобство одной таблицы исчезает при первом же обновлении данных или при росте объёма.
- «Я не вижу связи в данных» — ищи колонку вида
*_id(customer_id, category_id, order_id) — это почти всегда внешний ключ.
Запомни
Данные разбиты на таблицы, чтобы каждый факт хранился один раз.
Связь между таблицами — это колонка id в одной таблице и ссылающаяся
на неё колонка xxx_id в другой.
Прочитайте урок до конца — прогресс засчитается автоматически