CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), username VARCHAR(100) UNIQUE NOT NULL, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE TABLE IF NOT EXISTS chats ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), first_user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, second_user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL, UNIQUE(first_user_id, second_user_id), CHECK (first_user_id != second_user_id) ); CREATE TABLE IF NOT EXISTS messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), sender_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, recipient_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, chat_id UUID NOT NULL REFERENCES chats(id) ON DELETE CASCADE, content TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE INDEX IF NOT EXISTS idx_messages_chat_id ON messages(chat_id); CREATE INDEX IF NOT EXISTS idx_messages_sender_id ON messages(sender_id); CREATE INDEX IF NOT EXISTS idx_messages_chat_created ON messages(chat_id, created_at);