trading-platform-database-v2/ddl/schemas/auth/tables/02-user_profiles.sql
rckrdmrd 45e77e9a9c feat: Initial commit - Database schemas and scripts
DDL schemas for Trading Platform:
- User management
- Authentication
- Payments
- Education
- ML predictions
- Trading data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:30:23 -06:00

71 lines
3.0 KiB
SQL

-- ============================================================================
-- OrbiQuant IA - Trading Platform
-- Schema: auth
-- File: tables/02-user_profiles.sql
-- Description: Extended user profile information
-- ============================================================================
CREATE TABLE auth.user_profiles (
-- Primary Key
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Foreign Key to Users
user_id UUID NOT NULL UNIQUE,
-- Personal Information
first_name VARCHAR(100),
last_name VARCHAR(100),
display_name VARCHAR(200),
avatar_url TEXT,
bio TEXT,
-- Localization
language VARCHAR(10) DEFAULT 'en',
timezone VARCHAR(50) DEFAULT 'UTC',
country_code VARCHAR(2),
-- Preferences
newsletter_subscribed BOOLEAN NOT NULL DEFAULT false,
marketing_emails_enabled BOOLEAN NOT NULL DEFAULT false,
notifications_enabled BOOLEAN NOT NULL DEFAULT true,
-- Metadata
metadata JSONB DEFAULT '{}'::jsonb,
-- Audit Fields
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- Foreign Key Constraints
CONSTRAINT fk_user_profiles_user FOREIGN KEY (user_id)
REFERENCES auth.users(id)
ON DELETE CASCADE
);
-- Indexes for Performance
CREATE INDEX idx_user_profiles_user_id ON auth.user_profiles(user_id);
CREATE INDEX idx_user_profiles_display_name ON auth.user_profiles(display_name);
CREATE INDEX idx_user_profiles_country ON auth.user_profiles(country_code);
CREATE INDEX idx_user_profiles_metadata ON auth.user_profiles USING gin(metadata);
-- Table Comments
COMMENT ON TABLE auth.user_profiles IS 'Extended user profile information and preferences';
-- Column Comments
COMMENT ON COLUMN auth.user_profiles.id IS 'Unique identifier for the profile';
COMMENT ON COLUMN auth.user_profiles.user_id IS 'Reference to the user account';
COMMENT ON COLUMN auth.user_profiles.first_name IS 'User first name';
COMMENT ON COLUMN auth.user_profiles.last_name IS 'User last name';
COMMENT ON COLUMN auth.user_profiles.display_name IS 'Public display name';
COMMENT ON COLUMN auth.user_profiles.avatar_url IS 'URL to user avatar image';
COMMENT ON COLUMN auth.user_profiles.bio IS 'User biography or description';
COMMENT ON COLUMN auth.user_profiles.language IS 'Preferred language (ISO 639-1 code)';
COMMENT ON COLUMN auth.user_profiles.timezone IS 'User timezone (IANA timezone database)';
COMMENT ON COLUMN auth.user_profiles.country_code IS 'Country code (ISO 3166-1 alpha-2)';
COMMENT ON COLUMN auth.user_profiles.newsletter_subscribed IS 'Newsletter subscription preference';
COMMENT ON COLUMN auth.user_profiles.marketing_emails_enabled IS 'Marketing emails preference';
COMMENT ON COLUMN auth.user_profiles.notifications_enabled IS 'In-app notifications preference';
COMMENT ON COLUMN auth.user_profiles.metadata IS 'Additional profile metadata as JSON';
COMMENT ON COLUMN auth.user_profiles.created_at IS 'Timestamp when profile was created';
COMMENT ON COLUMN auth.user_profiles.updated_at IS 'Timestamp when profile was last updated';