-- 014_house_reviews.sql -- CREATE TABLE house_reviews — отзывы жильцов на дома (из Houses Catalog) -- -- Dependencies: 009_houses.sql (houses table — FK house_id) -- Apply after: 013_listings_alter_seller.sql -- Apply before: 015_scrape_runs.sql -- -- Source: decisions/Schema_Avito_Houses_Listings_History.md sec 25 (NEW house_reviews table) -- Note: author_avatar и images НЕ сохраняем (требование 2026-05-23 — без картинок). -- -- Идемпотентно: безопасно запускать повторно. BEGIN; CREATE TABLE IF NOT EXISTS house_reviews ( id bigserial PRIMARY KEY, house_id bigint NOT NULL REFERENCES houses(id) ON DELETE CASCADE, source text NOT NULL DEFAULT 'avito', ext_review_id bigint NOT NULL, -- value.id из Avito API -- Автор (без аватара) author_name text, -- "Мария" -- author_avatar НЕ сохраняем (user req: без картинок) -- Мета-данные отзыва review_title text, -- "Новый, уютный, теплый..." score int CHECK (score BETWEEN 1 AND 5), model_experience text, -- "Живу в своей квартире" / "Часто там бываю" rated_date date, -- parsed из "9 октября 2025" -- Текст отзыва (три секции из textSections[]) text_main text, -- textSections[0].text если title="" text_pros text, -- textSections где title="Преимущества" text_cons text, -- textSections где title="Недостатки" -- images НЕ сохраняем (user req: без картинок — raw_payload содержит URLs для retrofit) raw_payload jsonb, -- полный объект из API для retrofit scraped_at timestamptz NOT NULL DEFAULT NOW(), UNIQUE (source, ext_review_id) ); CREATE INDEX IF NOT EXISTS hr_house_idx ON house_reviews (house_id, rated_date DESC); CREATE INDEX IF NOT EXISTS hr_source_ext_idx ON house_reviews (source, ext_review_id); COMMENT ON TABLE house_reviews IS 'Отзывы жильцов на дома из Avito Houses Catalog. 1 запись на (source, ext_review_id). ' 'Аватары и фото не сохраняются — используйте raw_payload для retrofit.'; COMMENT ON COLUMN house_reviews.model_experience IS 'Опыт автора: "Живу в своей квартире" / "Часто там бываю" / etc. (raw текст из Avito).'; COMMENT ON COLUMN house_reviews.text_pros IS 'Секция "Преимущества" из textSections. NULL если автор не заполнил.'; COMMENT ON COLUMN house_reviews.text_cons IS 'Секция "Недостатки" из textSections. NULL если автор не заполнил.'; COMMIT;