Pepelen
← Системный анализ: API, интеграции и данные

Урок

Модель данных: нормализация до 3НФ

Привести плоскую таблицу заказов к третьей нормальной форме — найти нарушения 1НФ, 2НФ и 3НФ и разнести данные по таблицам с ключами — и отличить дублирование от исторического значения.

1 / 7

Каждый факт — в одном месте

Нормализация до 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_id3НФТелефон — в 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 — текущая. Удалите первую — и старые чеки «подорожают» вместе с товаром. Так же адрес доставки — факт заказа, а не клиента: заказы бывают на разные адреса. Денормализация — осознанное нарушение ради скорости чтения, например в отчётах; его записывают вместе с причиной.