SQLLab
Теория· 8 мин· 10 XP

Зачем данные разбиты на таблицы

Зачем это нужно

Представь, что весь интернет-магазин хранится в одной 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 в другой.

Прочитайте урок до конца — прогресс засчитается автоматически