Нормализация: 1NF, 2NF и 3NF
Организуйте таблицы так, чтобы каждый факт хранился один раз, ровно в одном месте
- назвать три аномалии, которые вызывает избыточность,
- читать функциональную зависимость, например
order_id -> customer_id, - привести таблицу к 1NF (атомарные значения, без повторяющихся групп),
- достичь 2NF, убрав частичные зависимости от составного ключа,
- достичь 3NF, убрав транзитивные зависимости,
- решить, когда денормализация - разумный компромисс.
1. Проблема: одна большая таблица
Представьте интернет-магазин, который записывает каждую строку заказа в одну широкую таблицу. Это кажется удобным - всё в одном месте - но одни и те же данные о клиенте и товаре копируются во множество строк.
| order_id | customer_name | customer_city | products | total |
|---|---|---|---|---|
| 1001 | Aida Sultanova | Bishkek | Keyboard, Mouse | 45.00 |
| 1002 | Aida Sultanova | Bishkek | Monitor | 150.00 |
| 1003 | Boris Ivanov | Osh | Mouse | 15.00 |
Поскольку Aida Sultanova / Bishkek появляется в двух строках, а ячейка products втискивает несколько товаров вместе, эта таблица страдает от трёх классических аномалий:
- Аномалия обновления: если Aida переедет в Osh, вам придётся найти и изменить каждую строку, где она упомянута. Пропустите одну - и база данных заявит, что она живёт сразу в двух городах.
- Аномалия вставки: вы не можете записать нового клиента, который ещё ничего не заказал, потому что нет строки, куда его поместить, не выдумав фиктивный заказ.
- Аномалия удаления: удалите заказ 1003 - и вы сотрёте единственную запись о том, что Boris Ivanov вообще существует.
Нормализация убирает эти аномалии, давая каждой сущности реального мира - клиенту, товару, заказу - свою таблицу, чтобы факт записывался лишь однажды.