Аналитика и хранилища данных: OLTP против OLAP, схема "звезда"
Почему база, которая обслуживает ваш магазин, имеет неподходящую форму для его анализа
- отличать нагрузку OLTP от OLAP и объяснить, почему одна схема не может хорошо обслуживать обе;
- определять таблицу фактов и таблицы измерений в проекте и формулировать гранулярность;
- строить схему "звезда" и писать к ней агрегирующие запросы;
- объяснять, почему хранилища намеренно денормализуют данные;
- обрабатывать изменяющиеся описательные данные с помощью медленно меняющихся измерений (Тип 1 против Типа 2).
1. Две очень разные задачи: OLTP против OLAP
Вы уже умеете проектировать нормализованную схему, добавлять индексы и оборачивать изменения в транзакции. Эти навыки служат OLTP — оперативной обработке транзакций — где база данных обслуживает работающее приложение: оформление покупки, бронирование, банковский перевод. Нагрузка — это множество крошечных чтений и записей, каждая из которых затрагивает несколько строк и должна быть корректна прямо сейчас.
OLAP — оперативная аналитическая обработка — это сторона отчётности и аналитики: "выручка по категориям по кварталам", "десять городов с самым быстрым ростом продаж", "средний размер корзины по выходным". Один такой запрос может прочитать миллионы исторических строк, сгруппировать и агрегировать их, и ему не нужен самый свежий заказ этой секунды — данные несколькочасовой давности вполне подойдут.
| Аспект | OLTP (база приложения) | OLAP (хранилище) |
|---|---|---|
| Типичный запрос | чтение/вставка нескольких строк по ключу | сканирование и агрегация миллионов строк |
| Записи | постоянные, мелкие, по одной строке | пакетная загрузка по расписанию (ночью/ежечасно) |
| Цель схемы | нормализация, без избыточности | денормализация, удобство агрегации |
| Строк на запрос | от 1 до нескольких | от тысяч до миллионов |
| Пользователи | приложение, конечные клиенты | аналитики, дашборды, отчёты |
| Свежесть | до миллисекунды | приемлемы данные многочасовой давности |
Обе нагрузки хотят противоположного, поэтому зрелые организации разделяют их: приложение пишет в свою OLTP-базу, а периодический процесс ETL (Extract, Transform, Load — извлечение, преобразование, загрузка) копирует и переформатирует эти данные в отдельное хранилище для OLAP. Запуск тяжёлой аналитики прямо на живой OLTP-базе конкурирует с реальными клиентами за блокировки и буферную память и может замедлить оформление покупок до предела.