-- 创建访问记录表 CREATE TABLE visits ( id BIGSERIAL PRIMARY KEY, path VARCHAR(500) NOT NULL, ip_hash VARCHAR(64) NOT NULL, user_agent TEXT, referrer VARCHAR(500), country VARCHAR(10), created_at TIMESTAMPWITHTIME ZONE DEFAULT NOW() );
-- 创建索引提升查询性能 CREATE INDEX idx_visits_path ON visits(path); CREATE INDEX idx_visits_ip_hash ON visits(ip_hash); CREATE INDEX idx_visits_created_at ON visits(created_at); CREATEOR REPLACE FUNCTION immutable_date(timestampwithtime zone) RETURNSdateAS $$ SELECT $1::date; $$ LANGUAGEsql IMMUTABLE;
CREATE INDEX idx_visits_date ON visits(immutable_date(created_at));
-- 创建统计视图 CREATEOR REPLACE VIEW stats_summary AS SELECT COUNT(*) as total_pv, COUNT(DISTINCT ip_hash) as total_uv, COUNT(DISTINCTDATE(created_at)) as active_days FROM visits;
-- 创建每日统计视图 CREATEOR REPLACE VIEW daily_stats AS SELECT immutable_date(created_at) asdate, COUNT(*) as daily_pv, COUNT(DISTINCT ip_hash) as daily_uv FROM visits GROUPBY immutable_date(created_at) ORDERBYdateDESC;
-- 创建页面统计视图 CREATEOR REPLACE VIEW page_stats AS SELECT path, COUNT(*) as page_pv, COUNT(DISTINCT ip_hash) as page_uv FROM visits GROUPBY path ORDERBY page_pv DESC;
-- 启用行级安全策略(可选,用于数据保护) ALTER TABLE visits ENABLE ROW LEVEL SECURITY;
-- 创建允许插入和查询的策略 CREATE POLICY "Allow insert visits" ON visits FORINSERTWITHCHECK (true); CREATE POLICY "Allow select visits" ON visits FORSELECTUSING (true);