40 lines
1.5 KiB
SQL
Executable file
40 lines
1.5 KiB
SQL
Executable file
-- E2E Schema Extensions
|
|
-- Creates tables needed for conversion funnel E2E testing
|
|
-- This file runs before the main schema (prefixed with 00-)
|
|
|
|
-- Enable TimescaleDB extension
|
|
CREATE EXTENSION IF NOT EXISTS timescaledb;
|
|
|
|
-- Conversion Events table for funnel tracking
|
|
-- NOTE: TimescaleDB requires created_at in primary key for hypertable partitioning
|
|
CREATE TABLE IF NOT EXISTS conversion_events (
|
|
id UUID DEFAULT gen_random_uuid(),
|
|
session_id UUID NOT NULL,
|
|
user_id UUID,
|
|
stage VARCHAR(50) NOT NULL,
|
|
source VARCHAR(50),
|
|
campaign VARCHAR(255),
|
|
medium VARCHAR(50),
|
|
referrer TEXT,
|
|
landing_page TEXT,
|
|
device_type VARCHAR(20),
|
|
browser VARCHAR(50),
|
|
country VARCHAR(10),
|
|
value NUMERIC(12,2),
|
|
metadata JSONB DEFAULT '{}',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
PRIMARY KEY (id, created_at)
|
|
);
|
|
|
|
-- Create hypertable for time-series optimization
|
|
SELECT create_hypertable('conversion_events', 'created_at',
|
|
chunk_time_interval => INTERVAL '7 days',
|
|
if_not_exists => TRUE
|
|
);
|
|
|
|
-- Indexes for common query patterns
|
|
CREATE INDEX IF NOT EXISTS idx_conversion_events_session ON conversion_events(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_conversion_events_user ON conversion_events(user_id) WHERE user_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_conversion_events_stage ON conversion_events(stage, created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_conversion_events_source ON conversion_events(source, created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_conversion_events_created ON conversion_events(created_at DESC);
|