Что такое Slowly Changing Dimensions (типы SCD)?

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

Ответ

Slowly Changing Dimensions (SCD) — это методология в хранилищах данных для управления историей изменений в таблицах-измерениях (например, клиенты, продукты). Основные типы:

  1. Тип 1: Перезапись

    • Стратегия: Старые данные перезаписываются новыми. История не сохраняется.
    • Использование: Для исправления ошибок или когда история изменений не важна.
      -- Изменение города клиента. Старое значение теряется.
      UPDATE dim_customer 
      SET city = 'Новосибирск' 
      WHERE customer_id = 123;
  2. Тип 2: Добавление новой версии

    • Стратегия: При изменении атрибута создается новая строка с обновленными данными. Старая строка помечается как неактуальная. Это самый распространенный тип для сохранения полной истории.
    • Использование: Когда требуется полный аудит изменений.
      
      -- 1. Помечаем старую запись как неактивную
      UPDATE dim_customer 
      SET is_current = FALSE, valid_to = CURRENT_DATE - 1
      WHERE customer_id = 123 AND is_current = TRUE;

    -- 2. Добавляем новую запись INSERT INTO dim_customer (customer_id, name, city, is_current, valid_from, valid_to) VALUES (123, 'Иван Иванов', 'Новосибирск', TRUE, CURRENT_DATE, NULL);

  3. Тип 3: Добавление нового столбца

    • Стратегия: Добавляются дополнительные столбцы для хранения предыдущего значения атрибута. Сохраняет только ограниченную историю (обычно одно предыдущее состояние).
    • Использование: Когда важно отслеживать конкретное изменение (например, предыдущий почтовый индекс).
      
      -- Добавляем столбец для предыдущего города
      ALTER TABLE dim_customer ADD COLUMN previous_city VARCHAR(100);

    -- При изменении обновляем оба столбца UPDATE dim_customer SET previous_city = city, city = 'Новосибирск' WHERE customer_id = 123;

Выбор типа зависит от бизнес-требований к детализации истории, производительности и сложности ETL-процессов.