feat(db): osm_poi_ekb table for site-finder POI analysis

This commit is contained in:
lekss361 2026-05-11 18:06:28 +03:00
parent ceaf553eb7
commit 688e094844

View file

@ -0,0 +1,56 @@
-- 82_osm_poi_ekb.sql
-- Context: Site Finder feature — анализ участка по близости к социальной
-- инфраструктуре. Хранение OSM POI для быстрых ST_DWithin запросов
-- в радиусе 1-3 км от анализируемого участка.
-- Dependencies: PostGIS extension (уже включён в prod)
-- Deploy order: standalone — нет зависимостей от других таблиц
-- Idempotent: да (IF NOT EXISTS / CREATE INDEX IF NOT EXISTS)
BEGIN;
CREATE TABLE IF NOT EXISTS osm_poi_ekb (
poi_id BIGSERIAL PRIMARY KEY,
osm_id BIGINT NOT NULL,
osm_type TEXT NOT NULL,
-- 'school' | 'kindergarten' | 'pharmacy' | 'hospital' | 'shop_mall' |
-- 'shop_supermarket' | 'shop_small' | 'park' | 'tram_stop' |
-- 'bus_stop' | 'metro_stop'
category TEXT NOT NULL,
name TEXT,
lat NUMERIC(10, 7) NOT NULL,
lon NUMERIC(10, 7) NOT NULL,
geom GEOMETRY(Point, 4326) NOT NULL,
-- Дата последнего редактирования POI в OSM.
-- Для фильтра "данные не старше 2 лет" (требование Максима).
last_osm_edit_date DATE,
-- Остальные OSM теги для drill-down
tags JSONB NOT NULL DEFAULT '{}'::jsonb,
fetched_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (osm_type, osm_id, category)
);
-- GIST индекс для ST_DWithin / ST_Intersects запросов
CREATE INDEX IF NOT EXISTS osm_poi_ekb_geom_gist
ON osm_poi_ekb USING GIST (geom);
-- Индекс по категории для фильтрации по типу инфраструктуры
CREATE INDEX IF NOT EXISTS osm_poi_ekb_category_idx
ON osm_poi_ekb (category);
-- Индекс по дате редактирования для фильтра свежести данных
CREATE INDEX IF NOT EXISTS osm_poi_ekb_last_edit_idx
ON osm_poi_ekb (last_osm_edit_date);
COMMENT ON TABLE osm_poi_ekb IS
'Социальная инфраструктура Екатеринбурга из OSM. Источник: Overpass API. '
'Используется для site-finder scoring (близость школ, садов, магазинов, ст. транспорта).';
COMMENT ON COLUMN osm_poi_ekb.category IS
'Нормализованная категория. Маппинг OSM-тегов → category: '
'см. backend/app/services/site_finder/poi_loader.py';
COMMENT ON COLUMN osm_poi_ekb.last_osm_edit_date IS
'Дата последнего редактирования POI в OSM. '
'Для фильтра "данные не старше 2 лет" (требование Максима).';
COMMIT;