Перейти к содержимому

21. DB Design: Нормализация

Процесс организации данных для минимизации избыточности и зависимостей.

✅ Критерии:

  • Атомарные значения (нельзя массивы в ячейке)
  • Уникальные имена колонок
  • Порядок строк не важен
-- ❌ Нарушение 1NF
CREATE TABLE users (
id INT,
name VARCHAR(100),
phones VARCHAR(500) -- '123-456, 789-012, ...'
);
-- ✅ 1NF
CREATE 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)
);

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)
);
-- ✅ 2NF
CREATE 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)
);

2NF + Нет транзитивных зависимостей.

-- ❌ Нарушение 3NF (city зависит от zip)
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100),
zip VARCHAR(10),
city VARCHAR(100) -- транзитивная зависимость!
);
-- ✅ 3NF
CREATE 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/аналитика (денормализация для скорости)
  • Логи (избыточность приемлема)
  • Кэши и временные таблицы

Следующий урок: Отношения в БД