21. DB Design: Нормализация
Процесс организации данных для минимизации избыточности и зависимостей.
Нормальные формы
Заголовок раздела «Нормальные формы»1NF (First Normal Form)
Заголовок раздела «1NF (First Normal Form)»✅ Критерии:
- Атомарные значения (нельзя массивы в ячейке)
- Уникальные имена колонок
- Порядок строк не важен
-- ❌ Нарушение 1NFCREATE TABLE users ( id INT, name VARCHAR(100), phones VARCHAR(500) -- '123-456, 789-012, ...');
-- ✅ 1NFCREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100));
CREATE TABLE user_phones ( id INT PRIMARY KEY, user_id INT REFERENCES users(id), phone VARCHAR(20));2NF (Second Normal Form)
Заголовок раздела «2NF (Second Normal Form)»1NF + Нет частичной зависимости от составного ключа.
-- ❌ Нарушение 2NF (product_name зависит только от product_id)CREATE TABLE order_items ( order_id INT, product_id INT, product_name VARCHAR(200), -- зависит только от product_id! quantity INT, PRIMARY KEY (order_id, product_id));
-- ✅ 2NFCREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(200));
CREATE TABLE order_items ( order_id INT, product_id INT REFERENCES products(id), quantity INT, PRIMARY KEY (order_id, product_id));3NF (Third Normal Form)
Заголовок раздела «3NF (Third Normal Form)»2NF + Нет транзитивных зависимостей.
-- ❌ Нарушение 3NF (city зависит от zip)CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(100), zip VARCHAR(10), city VARCHAR(100) -- транзитивная зависимость!);
-- ✅ 3NFCREATE TABLE zip_codes ( zip VARCHAR(10) PRIMARY KEY, city VARCHAR(100));
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(100), zip VARCHAR(10) REFERENCES zip_codes(zip));Когда НЕ нормализовать
Заголовок раздела «Когда НЕ нормализовать»- OLAP/аналитика (денормализация для скорости)
- Логи (избыточность приемлема)
- Кэши и временные таблицы
Следующий урок: Отношения в БД →