Почему витрины данных (Data Marts) предпочтительнее подхода «Одна большая таблица» (OBT)?

«Почему витрины данных (Data Marts) предпочтительнее подхода «Одна большая таблица» (OBT)?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Подход OBT (One Big Table) — это денормализованная таблица, объединяющая все измерения и факты. Хотя он упрощает запросы, у него есть серьезные недостатки по сравнению с витринами данных.

Проблемы OBT:

  1. Избыточность и объем: Сильное дублирование атрибутов измерений (например, имя клиента повторяется в каждой строке транзакции) приводит к неэффективному использованию хранилища.
  2. Сложность изменений: Добавление нового атрибута или изменение логики расчета метрики требует модификации всей монолитной таблицы, что рискованно и трудоемко.
  3. Смешение контекстов: Одна таблица пытается обслуживать все бизнес-процессы, что затрудняет оптимизацию и управление доступом.

Преимущества витрин:

  • Предметная ориентация: Каждая витрина строится для конкретной бизнес-области (например, sales_mart, marketing_mart), что упрощает понимание и использование бизнес-аналитиками.
  • Оптимизация производительности: Витрину можно оптимизировать под ее конкретные паттерны запросов: выбрать свою стратегию сортировки, партиционирования, агрегации или материализации.
  • Гибкость и независимость: Витрины можно перестраивать, добавлять или изменять независимо друг от друга, не затрагивая всю систему.
  • Упрощенная безопасность: Легче управлять правами доступа на уровне витрины, чем на уровне отдельных столбцов в гигантской таблице.

Пример:

-- OBT подход: сложный запрос к огромной таблице с джойнами "вшитыми" в данные.
SELECT
    customer_name, -- Дублируется в каждой строке
    product_category,
    SUM(sale_amount)
FROM one_big_table
WHERE region = 'EMEA' AND quarter = 'Q1'
GROUP BY customer_name, product_category;

-- Витрина продаж: данные уже агрегированы и подготовлены.
-- Таблица `sales_mart` может быть материализованным представлением или отдельной таблицей.
SELECT customer_key, product_category, total_sales_amount
FROM sales_mart -- Небольшая, оптимизированная таблица
WHERE region = 'EMEA' AND quarter = 'Q1';