CREATE TABLE IF NOT EXISTS post_analytics_traffic_daily ( day DATE NOT NULL, post_id UUID NOT NULL REFERENCES posts(id) ON DELETE CASCADE, source_group TEXT NOT NULL, source_name TEXT NOT NULL, device_type TEXT NOT NULL, os_name TEXT NOT NULL, keyword TEXT NOT NULL DEFAULT '', page_views INTEGER NOT NULL DEFAULT 0, visitors INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (day, post_id, source_group, source_name, device_type, os_name, keyword) ); CREATE INDEX IF NOT EXISTS post_analytics_traffic_daily_post_day_idx ON post_analytics_traffic_daily (post_id, day DESC); CREATE INDEX IF NOT EXISTS post_analytics_traffic_daily_source_idx ON post_analytics_traffic_daily (source_group, source_name); ALTER TABLE analytics_daily_visitors DROP CONSTRAINT IF EXISTS analytics_daily_visitors_scope_check; ALTER TABLE analytics_daily_visitors ADD CONSTRAINT analytics_daily_visitors_scope_check CHECK (scope IN ('site', 'post', 'page', 'traffic', 'post_traffic')); CREATE UNIQUE INDEX IF NOT EXISTS analytics_daily_visitors_post_traffic_uidx ON analytics_daily_visitors ( day, post_id, visitor_hash, source_group, source_name, device_type, os_name, keyword ) WHERE scope = 'post_traffic';