# Relational Schema ## Rules - UUID primary keys - `timestamptz` for all timestamps - No JSONB columns - Child tables for attributes and event payloads - Foreign keys wherever possible ## Core Tables ### users - `id` - `external_ref` - `created_at` - `preferred_language` - `device_platform` ### sessions - `id` - `user_id` - `started_at` - `ended_at` - `experiment_variant` - `app_version` - `device_model` - `os_version` - `locale_code` ### events - `id` - `sport_type` - `source_ref` - `title_en` - `title_sv` - `status` - `preview_start_ms` - `preview_end_ms` - `reveal_start_ms` - `reveal_end_ms` - `lock_at` - `settle_at` ### event_media - `id` - `event_id` - `media_type` - `hls_master_url` - `poster_url` - `duration_ms` - `preview_start_ms` - `preview_end_ms` - `reveal_start_ms` - `reveal_end_ms` ### markets - `id` - `event_id` - `question_key` - `market_type` - `status` - `lock_at` - `settlement_rule_key` ### outcomes - `id` - `market_id` - `outcome_code` - `label_key` - `sort_order` ### odds_versions - `id` - `market_id` - `version_no` - `created_at` - `is_current` ### outcome_odds - `id` - `odds_version_id` - `outcome_id` - `decimal_odds` - `fractional_num` - `fractional_den` ### bet_intents - `id` - `user_id` - `session_id` - `event_id` - `market_id` - `outcome_id` - `idempotency_key` - `client_sent_at` - `server_received_at` - `accepted` - `acceptance_code` - `accepted_odds_version_id` ### settlements - `id` - `market_id` - `settled_at` - `winning_outcome_id` ### experiment_assignments - `id` - `user_id` - `session_id` - `variant` - `assigned_at` ### localization_keys - `id` - `key_name` - `description` ### localization_values - `id` - `localization_key_id` - `locale_code` - `text_value` ### analytics_event_types - `id` - `event_name` - `description` ### analytics_events - `id` - `analytics_event_type_id` - `session_id` - `user_id` - `occurred_at` ### analytics_event_attributes - `id` - `analytics_event_id` - `attribute_key` - `attribute_value` ### audit_logs - `id` - `created_at` - `actor_type` - `actor_id` - `action_name` - `target_type` - `target_id` - `trace_id` - `note` ### audit_log_attributes - `id` - `audit_log_id` - `attribute_key` - `attribute_value` ## Indexes - `sessions.user_id` - `sessions.started_at` - `events.status` - `markets.event_id` - `markets.lock_at` - `bet_intents.session_id` - `bet_intents.market_id` - `bet_intents.idempotency_key` - `analytics_events.session_id` - `analytics_events.user_id` - `analytics_events.analytics_event_type_id` - `audit_logs.created_at`