34 lines
1.6 KiB
SQL
34 lines
1.6 KiB
SQL
-- Аналитика в 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)';
|