Улучшения комментариев
This commit is contained in:
@@ -89,7 +89,7 @@
|
|||||||
- Для snapshot-справочников (`airports`, `airplanes`, `routes`, `seats`) пустой источник считаем ошибкой:
|
- Для snapshot-справочников (`airports`, `airplanes`, `routes`, `seats`) пустой источник считаем ошибкой:
|
||||||
это почти всегда признак проблем с PXF/источником.
|
это почти всегда признак проблем с PXF/источником.
|
||||||
|
|
||||||
### 3.2. Комментарии в `*_load.sql`: точнее формулировать “идемпотентность”, а не “дедупликацию источника”
|
### 3.2. Комментарии в `*_load.sql`: точнее формулировать “идемпотентность”, а не “дедупликацию источника” (статус: исправлено)
|
||||||
|
|
||||||
Типовой паттерн:
|
Типовой паттерн:
|
||||||
```sql
|
```sql
|
||||||
@@ -101,7 +101,8 @@ WHERE NOT EXISTS (
|
|||||||
Это в первую очередь защита от повторного запуска того же таска в рамках одного `batch_id` (retry),
|
Это в первую очередь защита от повторного запуска того же таска в рамках одного `batch_id` (retry),
|
||||||
а не “лечение” дублей в источнике.
|
а не “лечение” дублей в источнике.
|
||||||
|
|
||||||
Рекомендация: заменить формулировку комментариев на “идемпотентность для текущего батча”.
|
Что сделано:
|
||||||
|
- В `sql/stg/*_load.sql` комментарии приведены к формулировке “идемпотентность при повторном запуске/ретрае”.
|
||||||
|
|
||||||
### 3.3. Проверка составных ключей: избегать склейки строк
|
### 3.3. Проверка составных ключей: избегать склейки строк
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ SELECT
|
|||||||
'{{ run_id }}'::text
|
'{{ run_id }}'::text
|
||||||
FROM stg.airplanes_ext AS ext
|
FROM stg.airplanes_ext AS ext
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.airplanes AS a
|
FROM stg.airplanes AS a
|
||||||
WHERE a.batch_id = '{{ run_id }}'::text
|
WHERE a.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ SELECT
|
|||||||
'{{ run_id }}'::text
|
'{{ run_id }}'::text
|
||||||
FROM stg.airports_ext AS ext
|
FROM stg.airports_ext AS ext
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.airports AS a
|
FROM stg.airports AS a
|
||||||
WHERE a.batch_id = '{{ run_id }}'::text
|
WHERE a.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ SELECT
|
|||||||
'{{ run_id }}'::text
|
'{{ run_id }}'::text
|
||||||
FROM stg.boarding_passes_ext AS ext
|
FROM stg.boarding_passes_ext AS ext
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
|
-- Считаем ключом строки (ticket_no, flight_id).
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.boarding_passes AS bp
|
FROM stg.boarding_passes AS bp
|
||||||
WHERE bp.batch_id = '{{ run_id }}'::text
|
WHERE bp.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ FROM stg.bookings_ext AS ext
|
|||||||
CROSS JOIN max_batch_ts AS mb
|
CROSS JOIN max_batch_ts AS mb
|
||||||
WHERE ext.book_date > mb.max_ts
|
WHERE ext.book_date > mb.max_ts
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.bookings AS b
|
FROM stg.bookings AS b
|
||||||
WHERE b.batch_id = '{{ run_id }}'::text
|
WHERE b.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ FROM stg.flights_ext AS ext
|
|||||||
CROSS JOIN max_batch_ts AS mb
|
CROSS JOIN max_batch_ts AS mb
|
||||||
WHERE ext.scheduled_departure > mb.max_ts
|
WHERE ext.scheduled_departure > mb.max_ts
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.flights AS f
|
FROM stg.flights AS f
|
||||||
WHERE f.batch_id = '{{ run_id }}'::text
|
WHERE f.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ SELECT
|
|||||||
'{{ run_id }}'::text
|
'{{ run_id }}'::text
|
||||||
FROM stg.routes_ext AS ext
|
FROM stg.routes_ext AS ext
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id по составному ключу (route_no, validity)
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
|
-- Считаем ключом строки (route_no, validity).
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.routes AS r
|
FROM stg.routes AS r
|
||||||
WHERE r.batch_id = '{{ run_id }}'::text
|
WHERE r.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ SELECT
|
|||||||
'{{ run_id }}'::text
|
'{{ run_id }}'::text
|
||||||
FROM stg.seats_ext AS ext
|
FROM stg.seats_ext AS ext
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id по составному ключу (airplane_code, seat_no)
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
|
-- Считаем ключом строки (airplane_code, seat_no).
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.seats AS s
|
FROM stg.seats AS s
|
||||||
WHERE s.batch_id = '{{ run_id }}'::text
|
WHERE s.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ JOIN stg.bookings_ext AS b ON t.book_ref = b.book_ref
|
|||||||
CROSS JOIN max_batch_ts AS mb
|
CROSS JOIN max_batch_ts AS mb
|
||||||
WHERE b.book_date > mb.max_ts
|
WHERE b.book_date > mb.max_ts
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
-- Защита от дублей в рамках одного batch_id
|
-- Идемпотентность: при повторном запуске/ретрае не вставляем повторно те же строки в рамках текущего batch_id.
|
||||||
|
-- Считаем ключом строки (ticket_no, flight_id).
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.segments AS s
|
FROM stg.segments AS s
|
||||||
WHERE s.batch_id = '{{ run_id }}'::text
|
WHERE s.batch_id = '{{ run_id }}'::text
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ JOIN stg.bookings_ext AS b ON ext.book_ref = b.book_ref
|
|||||||
CROSS JOIN max_batch_ts AS mb
|
CROSS JOIN max_batch_ts AS mb
|
||||||
WHERE b.book_date > mb.max_ts
|
WHERE b.book_date > mb.max_ts
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
-- Защита от дублей: ticket_no в источнике уникален, и в stg его не дублируем.
|
-- Идемпотентность: ticket_no — бизнес-ключ билета, не вставляем его повторно (включая ретраи/повторные запуски DAG).
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM stg.tickets AS t
|
FROM stg.tickets AS t
|
||||||
WHERE t.ticket_no = ext.ticket_no
|
WHERE t.ticket_no = ext.ticket_no
|
||||||
|
|||||||
Reference in New Issue
Block a user