Привести плоскую таблицу заказов к третьей нормальной форме — найти нарушения 1НФ, 2НФ и 3НФ и разнести данные по таблицам с ключами — и отличить дублирование от исторического значения.
Каждый факт — в одном месте
Нормализация до 3НФ
В курсе бизнес-анализа вы описывали сущности, связи, первичные и внешние ключи (PK, FK). Теперь — как разложить данные, чтобы каждый факт хранился один раз. Иначе появляются аномалии: курьер сменил телефон — правь сотни строк, часть забудут; телефон нового курьера без заказов негде записать; удалили его последний заказ — пропал и телефон.
Пример — плоская выгрузка, строка на заказ: 9002 | Анна | +7 000 000-00-01 | молоко ×2, хлеб ×1 | 12 | +7 000 000-00-12. Приводим её к нормальным формам по шагам:
• 1НФ: в ячейке одно значение, без списков и повторяющихся групп. Позиции уходят в order_items(order_id, product_id, quantity, price) — строка на товар.
• 2НФ — для составного ключа: неключевое поле зависит от всего ключа, а не от части. В order_items ключ (order_id, product_id), а название товара зависит только от product_id — оно уходит в products.
• 3НФ: неключевое поле не зависит от другого неключевого. Телефон курьера зависит от courier_id, а не от заказа — он уходит в couriers. Имя и телефон клиента так же уходят в customers.
Формула: поле зависит от ключа, от всего ключа и ни от чего, кроме ключа.
Не всякий повтор — дубль. order_items.price — цена в этом заказе на момент покупки, products.price — текущая. Удалите первую — и старые чеки «подорожают» вместе с товаром. Так же адрес доставки — факт заказа, а не клиента: заказы бывают на разные адреса.
Денормализация — осознанное нарушение ради скорости чтения, например в отчётах; его записывают вместе с причиной.
Нарушение → куда вынести
| Признак | Форма | Что сделать |
|---|---|---|
| В ячейке список: «молоко ×2, хлеб ×1» | 1НФ | Позиции — в order_items, строка на товар |
| product_name в order_items с ключом (order_id, product_id) | 2НФ | Название — в products |
| courier_phone в orders рядом с courier_id | 3НФ | Телефон — в couriers |
| price и в order_items, и в products | Не нарушение | Оставить: цена на момент покупки ≠ текущая |
Конспект урока
Нормализация до 3НФ
В курсе бизнес-анализа вы описывали сущности, связи, первичные и внешние ключи (PK, FK). Теперь — как разложить данные, чтобы каждый факт хранился один раз. Иначе появляются аномалии: курьер сменил телефон — правь сотни строк, часть забудут; телефон нового курьера без заказов негде записать; удалили его последний заказ — пропал и телефон.
Пример — плоская выгрузка, строка на заказ: 9002 | Анна | +7 000 000-00-01 | молоко ×2, хлеб ×1 | 12 | +7 000 000-00-12. Приводим её к нормальным формам по шагам:
• 1НФ: в ячейке одно значение, без списков и повторяющихся групп. Позиции уходят в order_items(order_id, product_id, quantity, price) — строка на товар.
• 2НФ — для составного ключа: неключевое поле зависит от всего ключа, а не от части. В order_items ключ (order_id, product_id), а название товара зависит только от product_id — оно уходит в products.
• 3НФ: неключевое поле не зависит от другого неключевого. Телефон курьера зависит от courier_id, а не от заказа — он уходит в couriers. Имя и телефон клиента так же уходят в customers.
Формула: поле зависит от ключа, от всего ключа и ни от чего, кроме ключа.
Не всякий повтор — дубль. order_items.price — цена в этом заказе на момент покупки, products.price — текущая. Удалите первую — и старые чеки «подорожают» вместе с товаром. Так же адрес доставки — факт заказа, а не клиента: заказы бывают на разные адреса.
Денормализация — осознанное нарушение ради скорости чтения, например в отчётах; его записывают вместе с причиной.