-- Аналитика в Postgres: события и дневные счётчики сообщений. -- Партиции по дням создаёт приложение; старые партиции не удаляются. CREATE SCHEMA IF NOT EXISTS analytics; CREATE TABLE IF NOT EXISTS analytics.events ( event_time timestamptz NOT NULL, event_type text NOT NULL, user_id bigint NOT NULL DEFAULT 0, username text NOT NULL DEFAULT '', chat_id bigint NOT NULL DEFAULT 0, payload jsonb NOT NULL DEFAULT '{}'::jsonb, bot_version text NOT NULL DEFAULT '', prod boolean NOT NULL DEFAULT false ) PARTITION BY RANGE (event_time); CREATE INDEX IF NOT EXISTS idx_events_time ON analytics.events (event_time); CREATE INDEX IF NOT EXISTS idx_events_type_time ON analytics.events (event_type, event_time); CREATE INDEX IF NOT EXISTS idx_events_user_time ON analytics.events (user_id, event_time); COMMENT ON TABLE analytics.events IS 'События бота (партиции по дням, без автоудаления)'; CREATE TABLE IF NOT EXISTS analytics.messages_daily ( day date NOT NULL, user_id bigint NOT NULL, username text NOT NULL DEFAULT '', chat_id bigint NOT NULL DEFAULT 0, count bigint NOT NULL DEFAULT 0, PRIMARY KEY (day, user_id, chat_id) ) PARTITION BY RANGE (day); CREATE INDEX IF NOT EXISTS idx_messages_daily_user_day ON analytics.messages_daily (user_id, day); COMMENT ON TABLE analytics.messages_daily IS 'Количество сообщений пользователя по дням (upsert)';