From e29a249830fb162cea111e334a436d1cb50490c2 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 1 Mar 2026 17:42:42 +0300 Subject: [PATCH] =?UTF-8?q?docs(dds):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=83=D1=87=D0=B5=D0=B1=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20SK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - объяснить студентам, почему подход MAX() + ROW_NUMBER() безопасен только при последовательном запуске. - Что: - добавлен комментарий в dim_airplanes_load.sql. - добавлен комментарий в dim_airports_load.sql. - добавлен комментарий в dim_passengers_load.sql. - добавлен комментарий в dim_routes_load.sql. - добавлен комментарий в dim_tariffs_load.sql. - Проверка: - git diff HEAD~1 sql/dds/. --- sql/dds/dim_airplanes_load.sql | 4 ++++ sql/dds/dim_airports_load.sql | 4 ++++ sql/dds/dim_passengers_load.sql | 4 ++++ sql/dds/dim_routes_load.sql | 4 ++++ sql/dds/dim_tariffs_load.sql | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/sql/dds/dim_airplanes_load.sql b/sql/dds/dim_airplanes_load.sql index 6eb1344..05999dd 100644 --- a/sql/dds/dim_airplanes_load.sql +++ b/sql/dds/dim_airplanes_load.sql @@ -55,6 +55,10 @@ src AS ( LEFT JOIN seats_agg AS sa ON sa.airplane_code = a.airplane_code ), +-- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER() +-- Этот подход работает безопасно только потому, что Airflow запускает +-- джобы загрузки для одной таблицы строго последовательно (concurrency=1). +-- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK. max_sk AS ( SELECT COALESCE(MAX(airplane_sk), 0) AS v FROM dds.dim_airplanes diff --git a/sql/dds/dim_airports_load.sql b/sql/dds/dim_airports_load.sql index 666e0bc..faf59ae 100644 --- a/sql/dds/dim_airports_load.sql +++ b/sql/dds/dim_airports_load.sql @@ -21,6 +21,10 @@ WHERE d.airport_bk = s.airport_code ); -- Statement 2: INSERT новых записей (MAX(sk) + ROW_NUMBER()). +-- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER() +-- Этот подход работает безопасно только потому, что Airflow запускает +-- джобы загрузки для одной таблицы строго последовательно (concurrency=1). +-- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK. WITH max_sk AS ( SELECT COALESCE(MAX(airport_sk), 0) AS v FROM dds.dim_airports diff --git a/sql/dds/dim_passengers_load.sql b/sql/dds/dim_passengers_load.sql index df48c0e..6075317 100644 --- a/sql/dds/dim_passengers_load.sql +++ b/sql/dds/dim_passengers_load.sql @@ -51,6 +51,10 @@ WITH src AS ( ) AS d WHERE d.rn = 1 ), +-- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER() +-- Этот подход работает безопасно только потому, что Airflow запускает +-- джобы загрузки для одной таблицы строго последовательно (concurrency=1). +-- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK. max_sk AS ( SELECT COALESCE(MAX(passenger_sk), 0) AS v FROM dds.dim_passengers diff --git a/sql/dds/dim_routes_load.sql b/sql/dds/dim_routes_load.sql index 49e0585..76113f5 100644 --- a/sql/dds/dim_routes_load.sql +++ b/sql/dds/dim_routes_load.sql @@ -74,6 +74,10 @@ WITH src AS ( FROM ods.routes ), max_sk AS ( + -- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER() + -- Этот подход работает безопасно только потому, что Airflow запускает + -- джобы загрузки для одной таблицы строго последовательно (concurrency=1). + -- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK. SELECT COALESCE(MAX(route_sk), 0) AS v FROM dds.dim_routes ) diff --git a/sql/dds/dim_tariffs_load.sql b/sql/dds/dim_tariffs_load.sql index ebe514f..cf4b87c 100644 --- a/sql/dds/dim_tariffs_load.sql +++ b/sql/dds/dim_tariffs_load.sql @@ -7,6 +7,10 @@ WITH src AS ( WHERE s.fare_conditions IS NOT NULL AND s.fare_conditions <> '' ), +-- Учебный комментарий: Генерация SK через MAX() + ROW_NUMBER() +-- Этот подход работает безопасно только потому, что Airflow запускает +-- джобы загрузки для одной таблицы строго последовательно (concurrency=1). +-- При параллельной загрузке возникнет состояние гонки (race condition) и возможны дубли SK. max_sk AS ( SELECT COALESCE(MAX(tariff_sk), 0) AS v FROM dds.dim_tariffs