-- Users table CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password_hash TEXT NOT NULL, role VARCHAR(50) NOT NULL DEFAULT 'user', created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- God Logs table CREATE TABLE IF NOT EXISTS god_logs ( id SERIAL PRIMARY KEY, god_user_id INTEGER NOT NULL, action TEXT NOT NULL, details TEXT, timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (god_user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Personas table CREATE TABLE IF NOT EXISTS personas ( id SERIAL PRIMARY KEY, owner_id INTEGER NOT NULL, name VARCHAR(255) NOT NULL, title VARCHAR(255), bio TEXT, theories JSONB, -- JSON string in SQLite, JSONB in PG stance TEXT, system_prompt TEXT, is_public BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE ); -- Moderators table CREATE TABLE IF NOT EXISTS moderators ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, title VARCHAR(255) DEFAULT '主持人', bio TEXT, system_prompt TEXT, greeting_template TEXT, closing_template TEXT, summary_template TEXT, creator_id INTEGER NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE ); -- Forums table CREATE TABLE IF NOT EXISTS forums ( id SERIAL PRIMARY KEY, topic TEXT NOT NULL, creator_id INTEGER NOT NULL, moderator_id INTEGER, status VARCHAR(50) DEFAULT 'active', summary_history JSONB DEFAULT '[]', start_time TIMESTAMP WITH TIME ZONE, end_time TIMESTAMP WITH TIME ZONE, duration_minutes INTEGER DEFAULT 30, FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (moderator_id) REFERENCES moderators(id) ); -- Forum Participants table CREATE TABLE IF NOT EXISTS forum_participants ( forum_id INTEGER NOT NULL, persona_id INTEGER NOT NULL, thoughts_history JSONB DEFAULT '[]', PRIMARY KEY (forum_id, persona_id), FOREIGN KEY (forum_id) REFERENCES forums(id) ON DELETE CASCADE, FOREIGN KEY (persona_id) REFERENCES personas(id) ON DELETE CASCADE ); -- Messages table CREATE TABLE IF NOT EXISTS messages ( id SERIAL PRIMARY KEY, forum_id INTEGER NOT NULL, persona_id INTEGER, moderator_id INTEGER, speaker_name VARCHAR(255) NOT NULL, content TEXT NOT NULL, turn_count INTEGER DEFAULT 0, thought TEXT, timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (forum_id) REFERENCES forums(id) ON DELETE CASCADE, FOREIGN KEY (persona_id) REFERENCES personas(id), FOREIGN KEY (moderator_id) REFERENCES moderators(id) ); -- Observations table CREATE TABLE IF NOT EXISTS observations ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, forum_id INTEGER NOT NULL, joined_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, left_at TIMESTAMP WITH TIME ZONE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (forum_id) REFERENCES forums(id) ON DELETE CASCADE ); -- System Logs table CREATE TABLE IF NOT EXISTS system_logs ( id SERIAL PRIMARY KEY, forum_id INTEGER NOT NULL, level VARCHAR(50) DEFAULT 'info', source VARCHAR(255), content TEXT NOT NULL, timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (forum_id) REFERENCES forums(id) ON DELETE CASCADE );