Какие слои обычно присутствуют в архитектуре хранилища данных (DWH)?

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

Ответ

В классической послойной архитектуре хранилища данных (слоистой, или layered architecture) я обычно работал со следующими уровнями:

  1. Staging Area (Зона загрузки): Сырые, неизменённые данные, зеркально загруженные из источников (source system). Здесь данные временно хранятся в формате, близком к исходному. Цель — изоляция источников и обеспечение точки восстановления.

    -- Пример таблицы в Staging
    CREATE TABLE stg_orders (
        source_id RAW(16),
        order_data CLOB, -- сырой JSON/XML
        extracted_at TIMESTAMP DEFAULT SYSTIMESTAMP
    );
  2. Integration Layer / Core DWH (Слой интеграции): Здесь происходит очистка (data cleansing), стандартизация, дедупликация и объединение данных из разных источников в согласованные бизнес-сущности. Часто реализуется в виде нормализованной схемы (3NF) или Data Vault.

    -- Пример: преобразование сырых данных в детализированные таблицы
    INSERT INTO dim_customer (customer_nk, name, email, valid_from)
    SELECT 
        j.customer_id,
        j.customer_name,
        j.customer_email,
        SYSDATE
    FROM stg_orders s,
         JSON_TABLE(s.order_data, '$' COLUMNS (customer_id NUMBER, customer_name VARCHAR2(100), customer_email VARCHAR2(200))) j;
  3. Data Marts / Presentation Layer (Слой представления): Оптимизированные для конечного потребления схемы, обычно денормализованные (звёздная или снежинка). Это уровень, к которому подключаются BI-инструменты (Tableau, Power BI). Данные здесь агрегированы и структурированы по предметным областям (финансы, продажи).

    -- Пример таблицы фактов в витрине данных по продажам
    CREATE TABLE fct_sales (
        date_key INT REFERENCES dim_date(date_key),
        product_key INT REFERENCES dim_product(product_key),
        customer_key INT REFERENCES dim_customer(customer_key),
        quantity_sold NUMBER,
        amount_sold NUMBER(10,2)
    ) COMPRESS FOR QUERY;

В современных облачных DWH (BigQuery, Snowflake) границы между слоями могут быть более размыты, но логическое разделение на "сырые", "очищенные" и "потребляемые" данные сохраняется.