38 lines
1.3 KiB
SQL
38 lines
1.3 KiB
SQL
-- statistic 服务 events 原始表
|
|
-- 创建时间: 2026-06-08
|
|
-- 说明: 事件原始表,按 received_at 按日分区
|
|
-- 关联: spec §3.2
|
|
|
|
-- 1. 创建 schema
|
|
CREATE SCHEMA IF NOT EXISTS statistic;
|
|
|
|
-- 2. 创建 events 主表(按 received_at 按日分区)
|
|
CREATE TABLE IF NOT EXISTS statistic.events (
|
|
id BIGSERIAL,
|
|
event_id UUID NOT NULL,
|
|
user_id BIGINT NOT NULL,
|
|
star_id BIGINT NOT NULL,
|
|
event_type VARCHAR(64) NOT NULL,
|
|
occurred_at TIMESTAMPTZ NOT NULL,
|
|
received_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
properties JSONB NOT NULL DEFAULT '{}',
|
|
|
|
PRIMARY KEY (id, received_at)
|
|
) PARTITION BY RANGE (received_at);
|
|
|
|
-- 3. 唯一约束(去重):同一 event_id 不能重复
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_events_event_id
|
|
ON statistic.events (event_id, received_at);
|
|
|
|
-- 4. 看板查询主索引(覆盖 90% 查询)
|
|
CREATE INDEX IF NOT EXISTS idx_events_user_star_type_time
|
|
ON statistic.events (user_id, star_id, event_type, received_at DESC);
|
|
|
|
-- 5. 趋势分析索引
|
|
CREATE INDEX IF NOT EXISTS idx_events_star_type_time
|
|
ON statistic.events (star_id, event_type, received_at DESC);
|
|
|
|
-- 6. JSONB 属性 GIN 索引
|
|
CREATE INDEX IF NOT EXISTS idx_events_properties_gin
|
|
ON statistic.events USING GIN (properties);
|