Что такое снежинка (snowflake) в контексте нормальных форм? Находится ли схема «снежинка» в 3NF?

«Что такое снежинка (snowflake) в контексте нормальных форм? Находится ли схема «снежинка» в 3NF?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Снежинка (snowflake) — это нормализованная схема хранения данных в хранилище (DWH), которая является расширением схемы "звезда" (star schema). В ней таблицы измерений (dimensions) дополнительно нормализуются, разбиваясь на иерархические связанные таблицы.

Да, схема "снежинка" по определению находится в 3NF (Third Normal Form), а часто и в BCNF. Это ее ключевое отличие от "звезды", где измерения денормализованы.

Условия 3NF:

  1. Таблица находится во 2NF (нет частичных зависимостей от составного ключа).
  2. Нет транзитивных зависимостей (неключевые атрибуты зависят только от первичного ключа, а не от других неключевых атрибутов).

Пример нарушения 3NF и исправления через "снежинку":

-- Таблица 'orders' с нарушением 3NF (customer_city зависит от customer_id, а не от order_id):
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    customer_name VARCHAR(100),
    customer_city VARCHAR(100), -- Транзитивная зависимость: city зависит от customer_id
    order_date DATE
);

-- Приведение к 3NF / Схема "снежинка":
CREATE TABLE dim_customer (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    city_id INT REFERENCES dim_city(city_id) -- Вынос в отдельную таблицу
);

CREATE TABLE dim_city (
    city_id INT PRIMARY KEY,
    city_name VARCHAR(100),
    region_id INT REFERENCES dim_region(region_id) -- Дальнейшая нормализация
);

CREATE TABLE fact_orders (
    order_id INT PRIMARY KEY,
    customer_id INT REFERENCES dim_customer(customer_id),
    order_date DATE
);

Преимущество снежинки — уменьшение избыточности данных и согласованность. Недостаток — более сложные запросы с большим количеством JOIN, что может влиять на производительность.