Все ли данные будут объединены в схеме «Снежинка»?

«Все ли данные будут объединены в схеме «Снежинка»?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, в схеме "Снежинка" (Snowflake Schema) данные не объединены в одну большую таблицу. Это нормализованная версия схемы "Звезда" (Star Schema).

Структура "Снежинки":

  1. Факты (Fact Table): Одна центральная таблица фактов, содержащая количественные показатели (меры) и ключи для связей с измерениями.
  2. Измерения (Dimension Tables): Несколько таблиц измерений, связанных с таблицей фактов.
  3. Ключевая особенность: Таблицы измерений нормализованы. Это означает, что они могут сами ссылаться на другие подчинённые таблицы измерений, образуя иерархическую структуру, которая визуально напоминает снежинку.

Пример для интернет-магазина:

  • Таблица фактов: Sales (содержит sale_id, product_key, customer_key, date_key, amount).
  • Таблица измерения Dim_Product ссылается не напрямую на категорию, а на отдельную таблицу Dim_Category. А Dim_Category, в свою очередь, может ссылаться на Dim_Department.
-- Пример связи в Snowflake Schema
SELECT
    s.amount,
    p.product_name,
    c.category_name,
    d.department_name
FROM fact_sales s
JOIN dim_product p ON s.product_key = p.product_key
JOIN dim_category c ON p.category_key = c.category_key -- Нормализация!
JOIN dim_department d ON c.department_key = d.department_key; -- Нормализация!
Сравнение со "Звездой": Аспект Схема "Звезда" Схема "Снежинка"
Нормализация Денормализована (измерения плоские) Нормализована (измерения иерархичны)
Избыточность данных Высокая (повторы в измерениях) Низкая (данныe об иерархии хранятся один раз)
Сложность запросов Проще (меньше JOIN) Сложнее (больше JOIN из-за нормализации)
Потребление диска Больше Меньше
Оптимальна для Частых аналитических запросов, где важна скорость Сценариев с жёсткими требованиями к целостности данных и экономии дискового пространства

Итог: "Снежинка" не объединяет, а, наоборот, разделяет (нормализует) данные по иерархиям для уменьшения избыточности, что может усложнить запросы, но экономит место и упрощает поддержку целостности.