Короткий ответ
Единственно верного ответа нет — решение зависит от того, какие BI-инструменты и аналитики будут напрямую писать запросы (чем проще конечные пользователи, тем сильнее аргумент в пользу звезды), от частоты обновления иерархических справочников и от того, насколько критична экономия места в конкретной колоночной СУБД.
Как это работает подробнее
В звезде денормализованные измерения проще для self-service BI и требуют меньше JOIN на единицу запроса, но дублируют данные и усложняют обновление часто меняющихся иерархий (например, организационная структура); снежинка нормализует иерархии в отдельные таблицы, упрощая их поддержку, но требует больше JOIN на каждый запрос.
Пример кода
example.sql
-- Гибрид: dim_product денормализован (звезда) для простоты,
-- но dim_geography (большая иерархия страна->регион->город) вынесена в снежинку
SELECT p.product_name, g.city, SUM(f.amount)
FROM fact_sales f
JOIN dim_product p ON f.product_id = p.product_id
JOIN dim_geography g ON f.geo_id = g.geo_id
GROUP BY p.product_name, g.city;Что использовать на практике
- На практике. В современных колоночных DWH (BigQuery, Snowflake, ClickHouse) стоимость дополнительных JOIN и места часто менее критична, чем в классических row-oriented СУБД, поэтому многие команды предпочитают умеренную денормализацию (близкую к звезде) ради простоты для аналитиков, оставляя снежинку только для действительно больших и часто меняющихся иерархических справочников.
- Проверка. замерить реальное время выполнения типового отчётного запроса в обоих вариантах на репрезентативном объёме данных и сравнить со сложностью поддержки изменений иерархии (сколько строк нужно обновить при реструктуризации регионов).
Подводные камни
- Частые ошибки. Проектируют строгую снежинку «по учебнику» для всех измерений без учёта реальной частоты их обновления и без учёта того, что конечные пользователи — это аналитики, пишущие ad-hoc SQL, а не только фиксированные ETL-процессы, которым сложность JOIN не важна.
- Компромисс. Полная звезда проще для бизнес-пользователей и быстрее для большинства запросов, но может привести к дублированию и рассинхрону данных при обновлении иерархий; полная снежинка нормализует данные, но увеличивает сложность запросов и порог входа для нетехнических аналитиков. На практике многие команды выбирают гибрид — звезда для часто используемых измерений, снежинка для больших редко меняющихся иерархий — и этот выбор нужно периодически пересматривать по мере роста данных и состава пользователей хранилища.