Что такое факты и измерения в хранилище данных?

Ответ

Это ключевые концепции многомерного моделирования в хранилищах данных, лежащие в основе схем «звезда» и «снежинка».

  • Факты (Facts) — это числовые, аддитивные показатели бизнес-процессов, которые можно суммировать, усреднять и т.д. Они отвечают на вопрос «Что произошло?».

    • Примеры: Сумма продажи, количество единиц товара, продолжительность звонка, остаток на счёте.
    • Хранятся в таблицах фактов, которые содержат ключи для связи с измерениями и сами числовые меры (metrics).
  • Измерения (Dimensions) — это описательные атрибуты, которые контекстуализируют факты. Они отвечают на вопросы «Кто? Что? Где? Когда? Почему?» и используются для фильтрации, группировки и маркировки данных.

    • Примеры: Дата, продукт, клиент, магазин, статус заказа.
    • Хранятся в таблицах измерений, которые содержат первичные ключи и текстовые/категориальные поля.

Пример на SQL (схема «звезда» для розничных продаж):

-- Измерение: Продукт
CREATE TABLE dim_product (
    product_key INT PRIMARY KEY, -- Суррогатный ключ
    product_id INT,              -- Бизнес-ключ из OLTP-системы
    product_name VARCHAR(255),
    category VARCHAR(100),
    brand VARCHAR(100)
);

-- Факт: Продажи
CREATE TABLE fact_sales (
    date_key INT REFERENCES dim_date(date_key),
    product_key INT REFERENCES dim_product(product_key),
    store_key INT REFERENCES dim_store(store_key),
    quantity_sold INT,          -- Мера (факт)
    revenue DECIMAL(15,2)       -- Мера (факт)
);

Простой аналитический запрос: SELECT brand, SUM(revenue) FROM fact_sales JOIN dim_product USING(product_key) GROUP BY brand;

Ответ 18+ 🔞

А, слушай, вот эта тема с фактами и измерениями — это ж, блядь, основа основ, хуй с горы! Если ты это не усек, то дальше можно даже не пытаться. Это как пытаться собрать Икею без инструкции — в итоге получится пиздопроебибна какая-то, а не шкаф.

Так вот, представь себе обычную кассу в магазине. Каждый раз, когда кассирша пищит штрихкодом и говорит «с вас 1500 рублей», она, сама того не зная, создаёт факт. Факты — это цифры, которые можно потрогать, сложить, посчитать среднее. «Что произошло?» Продали три пачки пельменей, две бутылки водки и журнал «Крот-огородник» на 1500 целковых. Вот это quantity_sold и revenue в таблице fact_sales. Суть фактов — их можно суммировать. Три пельмени плюс две водки — будет, ёпта, пять штук. Всё просто.

А теперь смотри. Кто купил эти пельмени? Когда? В каком именно магазине «Пятёрочка»? Какого хрена он купил именно журнал про крота? Вот эти все вопросы «кто, что, где, когда» — это уже измерения. Они не суммируются, блядь. Нельзя сложить «Москву» и «Питер» и получить «Москвопитер». Это контекст, обёртка, в которую завёрнуты голые цифры-факты. Клиент, дата, магазин, продукт — всё это измерения. Они живут в своих отдельных таблицах, типа dim_product или dim_date, и служат справочниками.

И вся магия начинается, когда ты их соединяешь. Как будто берёшь голый скелет фактов и натягиваешь на него мясо и кожу измерений. И из сухой цифры «1500 рублей» вдруг получается живая картина: «Вчера, в магазине на Ленинском, клиент Иванов (постоянный, кстати, полупидор) купил водку „Белуга“ и журнал „Крот“». Вот это и есть аналитика, ёбана!

Смотри на код, тут всё наглядно. Таблица dim_product — это справочник товаров. Там product_key — это наш внутренний, ровненький суррогатный ключ, чтобы не ебаться с кривыми айдишниками из старой системы. А product_id — это уже legacy, бизнес-ключ, на который всем насрать, но он есть.

А вот fact_sales — это уже святая святых, таблица фактов. В ней одни ссылки на измерения (date_key, product_key) и сами цифры — quantity_sold и revenue. Никакого лишнего говна вроде названия товара или адреса магазина! Только ключи и меры. Это и есть чистая, ядрёная «звезда».

И вся мощь видна в самом простом запросе внизу. Хочешь узнать, какая марка водки приносит больше всего бабла? JOIN-ни факты с товарами, сгруппируй по бренду и просуммируй выручку. И бац — тебе вываливается ответ: «Белуга» — 10 лямов, «Русский стандарт» — 8, а какая-нибудь «Мягков» — 50 рублей, потому что её только бомжи берут. Вот и вся аналитика, ебать мои старые костыли. Сначала кажется, что хуйня, а когда вникнешь — понимаешь, что это гениально просто и овердохуища мощно. Главное — не перепутать, где мясо (факты), а где кости (измерения).