Схема снежинка
Схема снежинка — это модель организации данных в хранилищах данных и системах бизнес-аналитики, представляющая собой расширение схемы «звезда». В схеме «снежинка» таблицы измерений (dimension tables) нормализованы, то есть разбиты на несколько связанных таблиц, образующих иерархическую структуру, напоминающую кристалл снежинки. Это позволяет уменьшить избыточность данных и упростить их поддержку, но может усложнить выполнение запросов и снизить производительность.
История и происхождение
Концепция схемы «снежинка» возникла в 1990-х годах как развитие идей Ральфа Кимбалла, одного из пионеров в области проектирования хранилищ данных. Кимбалл в своей книге «The Data Warehouse Toolkit» (1996) описал схему «звезда» как базовую модель для многомерного анализа, где центральная таблица фактов окружена денормализованными таблицами измерений. Однако для сложных иерархий и больших объёмов данных такая структура приводила к избыточности: одни и те же атрибуты (например, название города или категории товара) повторялись в каждой записи таблицы измерений.
Для решения этой проблемы была предложена нормализация таблиц измерений — разбиение их на подтаблицы, связанные внешними ключами. Такой подход получил название «снежинка» из-за визуального сходства с кристаллом снега: центральная таблица фактов, а от неё расходятся «лучи» измерений, которые, в свою очередь, ветвятся на более мелкие таблицы.
Структура и принципы
Схема «снежинка» базируется на двух типах таблиц:
- Таблица фактов (fact table) — центральная таблица, содержащая числовые показатели (меры) и внешние ключи, связывающие её с таблицами измерений. Каждая запись в таблице фактов соответствует событию или транзакции (например, продажа, клик, заказ).
- Таблицы измерений (dimension tables) — вспомогательные таблицы, описывающие атрибуты событий: время, продукт, клиент, местоположение и т.д. В схеме «снежинка» эти таблицы нормализованы, то есть разбиты на несколько уровней.
Пример нормализации
Рассмотрим измерение «Продукт» в схеме «звезда»:
- Таблица
dim_productсодержит поля:product_id,product_name,brand,category,subcategory.
В схеме «снежинка» это измерение может быть разбито на три таблицы:
dim_product:product_id,product_name,brand_id(внешний ключ)dim_brand:brand_id,brand_name,category_id(внешний ключ)dim_category:category_id,category_name,subcategory
Таким образом, вместо одной таблицы с повторяющимися названиями брендов и категорий создаётся иерархия, где каждый уровень хранится отдельно. Аналогично могут быть нормализованы измерения «Время» (год → квартал → месяц → день) или «Местоположение» (страна → регион → город).
Преимущества и недостатки
Преимущества
- Снижение избыточности данных — нормализация уменьшает дублирование атрибутов, что экономит дисковое пространство, особенно при большом количестве записей в таблицах измерений.
- Упрощение обновления данных — изменение атрибута (например, переименование категории) требует обновления только одной записи в соответствующей таблице, а не всех строк в денормализованном измерении.
- Поддержка сложных иерархий — схема «снежинка» естественным образом отражает многоуровневые структуры, такие как организационные деревья или географические деления.
- Гибкость в анализе — возможность агрегировать данные на разных уровнях иерархии без дублирования.
Недостатки
- Сложность запросов — для получения данных из нескольких уровней измерений требуется выполнение множества JOIN-операций, что увеличивает время выполнения запросов и нагрузку на базу данных.
- Снижение производительности — особенно заметно на больших объёмах данных, когда количество связей между таблицами растёт.
- Усложнение понимания схемы — для аналитиков и разработчиков схема «снежинка» менее интуитивна, чем «звезда», что затрудняет написание запросов и поддержку.
- Сложность индексации — для поддержания производительности может потребоваться больше индексов, что увеличивает время загрузки данных.
Сравнение со схемой «звезда»
| Характеристика | Схема «звезда» | Схема «снежинка» |
|---|---|---|
| Нормализация измерений | Денормализованы | Нормализованы |
| Количество таблиц | Мало (обычно 1 факт + 3–10 измерений) | Больше (из-за разбиения измерений) |
| Производительность запросов | Высокая (меньше JOIN) | Ниже (больше JOIN) |
| Избыточность данных | Высокая | Низкая |
| Простота понимания | Высокая | Средняя |
| Обновление данных | Сложнее (много дублирования) | Проще (одна запись на атрибут) |
Применение
Схема «снежинка» используется в тех случаях, когда важна целостность данных и низкая избыточность, а производительность запросов не является критическим фактором. Типичные сценарии:
- Хранилища данных с медленно меняющимися измерениями (SCD) — например, исторические данные о клиентах, где атрибуты (адрес, статус) меняются редко, но их корректное обновление критично.
- Системы с ограниченным дисковым пространством — когда объём данных измерений велик, а экономия места оправдывает усложнение схемы.
- Сложные иерархические структуры — например, в розничной торговле, где товары имеют многоуровневую категоризацию (отдел → категория → подкатегория → бренд → SKU).
- Аналитические системы с низкой частотой запросов — где время выполнения запроса не является приоритетом.
Пример реализации
Рассмотрим базу данных интернет-магазина. Таблица фактов sales содержит поля: sale_id, date_key, product_key, customer_key, quantity, amount. Измерение «Продукт» нормализовано:
dim_product:product_key,product_name,brand_keydim_brand:brand_key,brand_name,category_keydim_category:category_key,category_name
Измерение «Клиент» также может быть нормализовано:
dim_customer:customer_key,customer_name,city_keydim_city:city_key,city_name,region_keydim_region:region_key,region_name,country_key
Для получения суммы продаж по категориям товаров потребуется запрос с JOIN через три таблицы измерений.
Критика и альтернативы
Схема «снежинка» подвергается критике за снижение производительности и сложность. Многие специалисты рекомендуют использовать схему «звезда» как более практичную для большинства задач бизнес-аналитики, особенно в современных OLAP-системах с колоночными СУБД (например, ClickHouse, Vertica), где денормализация не приводит к значительному росту объёма данных.
Альтернативой является гибридный подход — частичная нормализация только тех измерений, где избыточность действительно критична, или использование материализованных представлений для ускорения запросов.
Источники
- Кимбалл Р. «The Data Warehouse Toolkit: The Definitive Guide to Dimensional Modeling» (3-е издание, 2013)
- Инмон Б. «Building the Data Warehouse» (4-е издание, 2005)
- Пономаренко В. С. «Проектирование хранилищ данных» (учебное пособие, 2018)
- Материалы курса «Data Warehousing and Business Intelligence» (University of California, Berkeley)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →