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

Ответ

В классической послойной архитектуре хранилища данных (слоистой, или 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) границы между слоями могут быть более размыты, но логическое разделение на "сырые", "очищенные" и "потребляемые" данные сохраняется.

Ответ 18+ 🔞

Слушай, а вот эта классическая слоёная архитектура хранилища — это вообще отдельная песня, пиздец. Я с ней столько лет проработал, что уже во сне таблицы вижу. По сути, это как три этажа в доме: подвал, где всё валяется в куче; жилой этаж, где уже прибрано; и гостиная, где всё блестит для гостей. И если на каком-то этапе накосячить — будет вам хиросима и нигерсраки, чувак.

Ну, поехали по этажам.

Первый этаж — Staging Area (Зона загрузки). Это, блядь, святое место. Сюда данные прилетают в том виде, в каком их выплюнула какая-нибудь старая кривая система-источник. Никакой правки, никакого вмешательства. Просто тупо зеркальная копия. Зачем? А чтобы, если на верхних этажах всё накроется медным тазом, можно было откатиться и начать заново. Это твоя страховка, понимаешь? Тут данные лежат, как есть: кривые, дублированные, с битыми символами — в общем, пиздопроебибна полная. Часто их просто пихают в CLOB или аналоги, чтобы не париться со структурой на этом этапе.

-- Пример таблицы в Staging
CREATE TABLE stg_orders (
    source_id RAW(16),
    order_data CLOB, -- сырой JSON/XML
    extracted_at TIMESTAMP DEFAULT SYSTIMESTAMP
);

Вот смотри: order_data CLOB — это и есть наш сырой кусок, который мы пока не трогаем. Просто положили и забыли. Доверия к источникам, блядь, ноль, поэтому и нужен этот слой.

Второй этаж — Integration Layer (Слой интеграции) или ядро DWH. Вот тут начинается магия, ёпта. Это уже жилой этаж. Берём эту сырую хрень из подвала и начинаем её чистить, выпрямлять и приводить в божеский вид. Дедупликация, стандартизация форматов, склейка данных из разных источников в одну логическую сущность. Часто тут используется нормализованная схема (та самая 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;

Видишь? Мы вытаскиваем JSON из того самого CLOB'а, парсим его и аккуратно раскладываем по полочкам в нормальную таблицу dim_customer. Это и есть работа интеграционного слоя — превратить бардак в порядок.

Третий, верхний этаж — Data Marts (Витрины) или Presentation Layer. А это уже, блядь, гостиная для показухи. Сюда пускаем аналитиков и их BI-инструменты вроде Tableau. Тут всё должно быть быстро и удобно. Поэтому данные здесь жёстко денормализуют — делают из них «звёздочки» или «снежинки». Всё агрегировано, оптимизировано под конкретные запросы и заточено под предметные области: продажи, финансы, маркетинг.

-- Пример таблицы фактов в витрине данных по продажам
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;

Вот fct_sales — это уже готовая к употреблению витрина. Аналитик подключается к ней и делает свои графики, не парясь, откуда данные взялись и как они чистились. Для него это просто «таблица продаж».

Конечно, сейчас в этих ваших облачных DWH типа BigQuery границы немного размываются. Можно и в одном датасете всё хранить, но логика-то остаётся прежней, ебать копать! Ты всё равно мысленно делишь данные на «сырые» (блять, только что приехали), «очищенные» (уже можно смотреть) и «потребляемые» (вот, бери и работай). Если эту логику нарушить и начать всё мешать в одну кучу — получится та ещё хитрая жопа, разгребать которую будут овердохуища времени.