Ответ
Снежинка (snowflake) — это нормализованная схема хранения данных в хранилище (DWH), которая является расширением схемы "звезда" (star schema). В ней таблицы измерений (dimensions) дополнительно нормализуются, разбиваясь на иерархические связанные таблицы.
Да, схема "снежинка" по определению находится в 3NF (Third Normal Form), а часто и в BCNF. Это ее ключевое отличие от "звезды", где измерения денормализованы.
Условия 3NF:
- Таблица находится во 2NF (нет частичных зависимостей от составного ключа).
- Нет транзитивных зависимостей (неключевые атрибуты зависят только от первичного ключа, а не от других неключевых атрибутов).
Пример нарушения 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, что может влиять на производительность.