Чем отличается денормализация в SQL от нормализации?

Ответ

Нормализация и денормализация — это противоположные процессы проектирования схемы базы данных.

Аспект Нормализация Денормализация
Цель Устранение избыточности данных, обеспечение целостности, минимизация аномалий при обновлении. Повышение производительности операций чтения за счет преднамеренного дублирования данных.
Подход Разделение данных на логические таблицы (соблюдение нормальных форм). Объединение данных или добавление избыточных столбцов в таблицы (нарушение нормальных форм).
Операции Оптимизирует запись/обновление (UPDATE, INSERT). Оптимизирует чтение (SELECT, сложные запросы с агрегацией).
JOIN Много JOIN-операций между таблицами. Минимум или отсутствие JOIN-операций.
Целостность Высокая, данные хранятся в одном месте. Пониженная, риск несогласованности из-за дублирования.

Пример на SQL:

Нормализованный запрос (требует JOIN):

SELECT o.order_id, o.total, c.name, c.email
FROM Orders o
JOIN Customers c ON o.customer_id = c.customer_id;

Денормализованная таблица и запрос (JOIN не нужен):

-- Таблица Orders уже содержит данные о клиенте
SELECT order_id, total, customer_name, customer_email
FROM Orders; -- Быстрее, но customer_name и customer_email дублируются

Вывод: Нормализация — стандарт для OLTP-систем (транзакционных). Денормализация — осознанный компромисс для OLAP-систем (аналитических), где скорость выполнения сложных запросов важнее эффективности обновлений.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с нормализацией и денормализацией — это как два мента, которые пытаются один и тот же бар охранять, но у них методы пиздец разные.

Смотри, в левом углу ринга — Нормализация. Это такой дотошный зануда, который всё по полочкам разложить хочет. Его главная идея — чтобы каждая хуйня в базе хранилась в одном-единственном месте. Нет повторений, нет лишних копий. Зачем? Да чтобы, когда ты адрес клиента меняешь, тебе не пришлось бегать по двадцати таблицам и везде его править, а то ошибешься в одном месте — и пиздец, данные уже не сходятся. Целостность, блядь, на высоте. Но за это приходится платить: чтобы собрать полную информацию, тебе придется делать кучу этих самых JOIN'ов, таблицы друг к другу прикручивать. Для систем, где постоянно что-то обновляют и добавляют (это и есть OLTP), — это святое.

А в правом углу — Денормализация. Это уже не зануда, а такой лихой похуист-оптимизатор. Его логика проста: "А нахуй эти вечные соединения? Давайте сразу всё, что нужно для отчета, в одну кучу сложим!" Он берет и дублирует данные наглым образом. Имя клиента? Да зачем его из отдельной таблицы тащить, давайте прямо в заказ продублируем! Запросы на чтение начинают летать как угорелые, потому что JOIN'ов почти нет. Но если этот клиент имя поменяет... ну, ёпта, а кто его будет во всех дублях обновлять? Правильно, никто. Риск несогласованности — овердохуищный. Зато для аналитики (OLAP), где данные раз в сутки обновляются, а читают их тоннами, — это просто маст хэв.

Вот тебе живой пример, чтобы совсем пиздец стало понятно:

Нормализованный подход (как по учебнику): Ты хочешь заказ с данными клиента получить, и тебе приходится две таблицы склеивать, как последний извращенец.

SELECT o.order_id, o.total, c.name, c.email
FROM Orders o
JOIN Customers c ON o.customer_id = c.customer_id;

Денормализованный подход (как в суровой реальности): А тут мы, блядь, ещё на этапе проектирования забили хуй на чистоту и просто засунули имя и почту клиента прямо в таблицу заказов. И теперь запрос — раз плюнуть.

-- Таблица Orders уже содержит данные о клиенте
SELECT order_id, total, customer_name, customer_email
FROM Orders; -- Быстрее, но customer_name и customer_email дублируются

Видишь разницу? В первом случае данные целые, но запрос сложнее. Во втором — всё быстро, но если клиент сменит почту, в старых заказах так и останется старая, и получится, что у него в системе три разных адреса. Красота, да?

Итог, блядь: Если твоя система — это касса магазина, где каждый чих в базу пишется, — нормализуйся, не мудачься. А если это склад отчётов для начальства, которое раз в день данные выгружает, а потом неделю графики разглядывает, — денормализируй на здоровье, главное скорость. Выбор всегда есть, просто надо понимать, за что ты платишь.