Улучшение DQ проверки
This commit is contained in:
@@ -104,12 +104,14 @@ WHERE NOT EXISTS (
|
|||||||
Что сделано:
|
Что сделано:
|
||||||
- В `sql/stg/*_load.sql` комментарии приведены к формулировке “идемпотентность при повторном запуске/ретрае”.
|
- В `sql/stg/*_load.sql` комментарии приведены к формулировке “идемпотентность при повторном запуске/ретрае”.
|
||||||
|
|
||||||
### 3.3. Проверка составных ключей: избегать склейки строк
|
### 3.3. Проверка составных ключей: избегать склейки строк (статус: исправлено)
|
||||||
|
|
||||||
Паттерн вида `COUNT(DISTINCT col1 || '|' || col2)` теоретически может давать коллизии (если в данных встречается разделитель).
|
Паттерн вида `COUNT(DISTINCT col1 || '|' || col2)` теоретически может давать коллизии (если в данных встречается разделитель).
|
||||||
В учебном стенде риск небольшой, но как “эталон” лучше показывать более безопасный подход:
|
В учебном стенде риск небольшой, но как “эталон” лучше показывать более безопасный подход.
|
||||||
- если поддерживается: `COUNT(DISTINCT (col1, col2))`;
|
|
||||||
- либо использовать стабильную сериализацию, где коллизии исключены (например, `md5(...)` от безопасной структуры).
|
Что сделано:
|
||||||
|
- Заменили склейку строк на `COUNT(DISTINCT md5(ROW(col1, col2)::text))` в DQ‑скриптах для составных ключей.
|
||||||
|
Такой подход сохраняет DV‑стиль и убирает неоднозначность разделителей.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Проверка на дубликаты (ticket_no, flight_id)
|
-- Проверка на дубликаты (ticket_no, flight_id)
|
||||||
SELECT COUNT(*) - COUNT(DISTINCT ticket_no || '|' || flight_id)
|
-- Используем md5 от ROW, чтобы избежать коллизий при склейке строк.
|
||||||
|
SELECT COUNT(*) - COUNT(DISTINCT md5(ROW(ticket_no, flight_id)::text))
|
||||||
INTO v_dup_count
|
INTO v_dup_count
|
||||||
FROM stg.boarding_passes AS bp
|
FROM stg.boarding_passes AS bp
|
||||||
WHERE bp.batch_id = v_batch_id;
|
WHERE bp.batch_id = v_batch_id;
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Проверка на дубликаты составного ключа (route_no, validity)
|
-- Проверка на дубликаты составного ключа (route_no, validity)
|
||||||
SELECT COUNT(*) - COUNT(DISTINCT route_no || '|' || validity)
|
-- Используем md5 от ROW, чтобы избежать коллизий при склейке строк.
|
||||||
|
SELECT COUNT(*) - COUNT(DISTINCT md5(ROW(route_no, validity)::text))
|
||||||
INTO v_dup_count
|
INTO v_dup_count
|
||||||
FROM stg.routes AS r
|
FROM stg.routes AS r
|
||||||
WHERE r.batch_id = v_batch_id;
|
WHERE r.batch_id = v_batch_id;
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Проверка на дубликаты составного ключа (airplane_code, seat_no)
|
-- Проверка на дубликаты составного ключа (airplane_code, seat_no)
|
||||||
SELECT COUNT(*) - COUNT(DISTINCT airplane_code || '|' || seat_no)
|
-- Используем md5 от ROW, чтобы избежать коллизий при склейке строк.
|
||||||
|
SELECT COUNT(*) - COUNT(DISTINCT md5(ROW(airplane_code, seat_no)::text))
|
||||||
INTO v_dup_count
|
INTO v_dup_count
|
||||||
FROM stg.seats AS s
|
FROM stg.seats AS s
|
||||||
WHERE s.batch_id = v_batch_id;
|
WHERE s.batch_id = v_batch_id;
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ BEGIN
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Проверка на дубликаты (ticket_no, flight_id)
|
-- Проверка на дубликаты (ticket_no, flight_id)
|
||||||
SELECT COUNT(*) - COUNT(DISTINCT ticket_no || '|' || flight_id)
|
-- Используем md5 от ROW, чтобы избежать коллизий при склейке строк.
|
||||||
|
SELECT COUNT(*) - COUNT(DISTINCT md5(ROW(ticket_no, flight_id)::text))
|
||||||
INTO v_dup_count
|
INTO v_dup_count
|
||||||
FROM stg.segments AS s
|
FROM stg.segments AS s
|
||||||
WHERE s.batch_id = v_batch_id;
|
WHERE s.batch_id = v_batch_id;
|
||||||
|
|||||||
Reference in New Issue
Block a user