market I: contract-view market.v_* поверх producer-таблиц #2130

Closed
opened 2026-07-02 13:40:07 +00:00 by lekss361 · 0 comments
Owner

Часть Epic #2127, шаг I (без зависимостей от пакета — можно стартовать сразу).

Goal

В схеме market создать стабильные contract-view поверх 5 сырых producer-таблиц, которые сейчас гранятся gendesign_reader напрямую (houses, house_sources, houses_price_dynamics, house_reliability_checks, house_reviews). View фиксируют публичный набор колонок и семантику — изолируют потребителя от churn внутренней схемы.

Files

  • tradein-mvp/backend/data/sql/NNN_market_contract_views.sql (новый; проверить коллизию basename — последние 138/139, взять свободный; .claude/rules/tradein.md)

Acceptance

  • SELECT * FROM market.v_houses LIMIT 1 работает (+ v_house_sources / v_houses_price_dynamics / v_house_reliability_checks / v_house_reviews)
  • View покрывают все колонки, что реально читает cross-load ETL #976 (сверить с gendesign-side reader-кодом: backend/app/services/etl/newbuilding_crossload.py, site_finder/premises_lookup.py, competitors.py)
  • Idempotent (CREATE OR REPLACE VIEW)
  • Column-contract задокументирован в шапке миграции (какие колонки, обещание стабильности)
  • Namespace market.v_* (отделить view от enrichment-таблиц)

Risk

CREATE OR REPLACE VIEW на деплое блокируется долгим прод-ридером (vault feedback_no_long_prod_query_during_view_migration) → убить фоновые тяжёлые SELECT перед мержем. Column-set определить ТОЧНО до (иначе версионирование контракта бессмысленно).

Agent: database-expert

Часть Epic #2127, шаг I (без зависимостей от пакета — **можно стартовать сразу**). ## Goal В схеме `market` создать стабильные contract-view поверх 5 сырых producer-таблиц, которые сейчас гранятся `gendesign_reader` напрямую (`houses`, `house_sources`, `houses_price_dynamics`, `house_reliability_checks`, `house_reviews`). View фиксируют публичный набор колонок и семантику — изолируют потребителя от churn внутренней схемы. ## Files - `tradein-mvp/backend/data/sql/NNN_market_contract_views.sql` (новый; проверить коллизию basename — последние 138/139, взять свободный; `.claude/rules/tradein.md`) ## Acceptance - `SELECT * FROM market.v_houses LIMIT 1` работает (+ v_house_sources / v_houses_price_dynamics / v_house_reliability_checks / v_house_reviews) - View покрывают все колонки, что реально читает cross-load ETL #976 (сверить с gendesign-side reader-кодом: `backend/app/services/etl/newbuilding_crossload.py`, `site_finder/premises_lookup.py`, `competitors.py`) - Idempotent (`CREATE OR REPLACE VIEW`) - Column-contract задокументирован в шапке миграции (какие колонки, обещание стабильности) - Namespace `market.v_*` (отделить view от enrichment-таблиц) ## Risk `CREATE OR REPLACE VIEW` на деплое блокируется долгим прод-ридером (vault `feedback_no_long_prod_query_during_view_migration`) → убить фоновые тяжёлые SELECT перед мержем. Column-set определить ТОЧНО до (иначе версионирование контракта бессмысленно). **Agent:** database-expert
lekss361 added the
data
priority/p2
scope/db
status/ready
tradein
labels 2026-07-02 13:41:51 +00:00
lekss361 added
status/qa
and removed
status/ready
labels 2026-07-02 14:04:02 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2130
No description provided.