23. DB Design: Денормализация
Намеренное добавление избыточности для повышения производительности.
Зачем денормализовать?
Заголовок раздела «Зачем денормализовать?»✅ Преимущества:
- Меньше JOIN’ов (быстрее SELECT)
- Проще запросы
- Лучше для read-heavy нагрузки
❌ Недостатки:
- Дублирование данных
- Сложнее UPDATE (нужно обновлять во многих местах)
- Риск inconsistency
Примеры денормализации
Заголовок раздела «Примеры денормализации»Кэширование агрегатов
Заголовок раздела «Кэширование агрегатов»-- Вместо COUNT(*) при каждом запросеCREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50), post_count INT DEFAULT 0, -- денормализация! follower_count INT DEFAULT 0);
-- Триггер для обновленияCREATE OR REPLACE FUNCTION update_post_count()RETURNS TRIGGER AS $$BEGIN UPDATE users SET post_count = post_count + 1 WHERE id = NEW.user_id; RETURN NEW;END;$$ LANGUAGE plpgsql;Дублирование для избежания JOIN
Заголовок раздела «Дублирование для избежания JOIN»-- Order с денормализованным именем пользователяCREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), user_name VARCHAR(100), -- дубль! (на момент заказа) total DECIMAL(10, 2));Следующий урок: EXPLAIN →