Ответ
В классической послойной архитектуре хранилища данных (слоистой, или layered architecture) я обычно работал со следующими уровнями:
-
Staging Area (Зона загрузки): Сырые, неизменённые данные, зеркально загруженные из источников (source system). Здесь данные временно хранятся в формате, близком к исходному. Цель — изоляция источников и обеспечение точки восстановления.
-- Пример таблицы в Staging CREATE TABLE stg_orders ( source_id RAW(16), order_data CLOB, -- сырой JSON/XML extracted_at TIMESTAMP DEFAULT SYSTIMESTAMP ); -
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; -
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 границы немного размываются. Можно и в одном датасете всё хранить, но логика-то остаётся прежней, ебать копать! Ты всё равно мысленно делишь данные на «сырые» (блять, только что приехали), «очищенные» (уже можно смотреть) и «потребляемые» (вот, бери и работай). Если эту логику нарушить и начать всё мешать в одну кучу — получится та ещё хитрая жопа, разгребать которую будут овердохуища времени.