Раздел 26 · Data Engineering

Нормализация против денормализации

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Диспетчеры «Гонца» не пишут SQL. Им нужна одна таблица, где всё подписано словами: заказ, зона «Уралмаш», курьер «Полина Ж.», велосипед, 213 рублей. Звезда из позапрошлого урока такого не даёт: в факте номера, а слова лежат в измерениях, и их надо соединять. Хочется просто сложить всё в одну широкую таблицу. Но тогда «Уралмаш» будет повторён тысячи раз, и однажды его придётся переименовать.

Адрес в записной книжке

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

А теперь ты завёл ещё и тетрадь поздравлений: «12 марта поздравил Иру, улица Ленина, 5». Удобно: открыл тетрадь, и сразу видно, куда отправлял открытки. Но Ира переехала, и адрес в тетради теперь повторён в тридцати строчках. Исправишь не все, и через год в тетради будет два адреса Иры, и непонятно, какой правильный.

Записная книжка это нормализация, тетрадь поздравлений это денормализация.

Каждый факт один раз

Нормализация требует хранить каждый факт ровно один раз. Название зоны лежит в zones, в заказах только её номер zone_id. Переименовали зону, поменяли одну строку, и все заказы сразу видят новое название через JOIN.

Так устроены рабочие базы приложений. Там важно, чтобы данные не противоречили сами себе: в рабочей базе «Гонца» постоянно что-то меняется, и повтор значения в тысяче строк означал бы тысячу мест, где его можно забыть обновить.

Повторять ради скорости

Денормализация сознательно повторяет данные. Название зоны и имя курьера пишутся прямо в каждую строку заказа. Запросу больше не нужны JOIN, а человеку не нужно знать, где лежат справочники.

Такую таблицу под конкретного потребителя называют витриной. Витрина для диспетчеров, витрина для бухгалтерии, витрина для дашборда Отто.

Плата за удобство это повторы. Посмотри, сколько строк приходится менять, когда зону «Центр» переименовывают.

Переименовать зону: справочник против витрины

База · courier

Загружаю редактор…

База загрузится, когда ты выполнишь запрос или откроешь таблицы.

Выполни запрос, чтобы увидеть результат.

Выполни весь запрос кнопкой или Ctrl/Cmd+Enter. Ctrl+Space открывает подсказки. Можно писать несколько команд через точку с запятой, менять данные и открывать транзакции. У каждой песочницы своя база, изменения живут до ухода со страницы. «Сбросить базу» возвращает учебные данные, но не меняет SQL.

В справочнике поменялась одна строка, в витрине 7704. А если бы витрину кто-то забыл обновить, в ней остался бы старый «Центр», а в справочнике уже новый. Это и есть противоречие, от которого защищает нормализация.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.