CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS questions ( id TEXT PRIMARY KEY, text TEXT NOT NULL, source TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS answers ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id TEXT NOT NULL REFERENCES questions(id) ON DELETE CASCADE, text TEXT NOT NULL, is_correct BOOLEAN NOT NULL, position INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS tests ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL REFERENCES users(id), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME, n_questions INTEGER NOT NULL, question_ids TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS test_answers ( test_id INTEGER NOT NULL REFERENCES tests(id) ON DELETE CASCADE, question_id TEXT NOT NULL REFERENCES questions(id), selected_answer_id INTEGER REFERENCES answers(id), is_correct BOOLEAN, answered_at DATETIME, PRIMARY KEY (test_id, question_id) ); CREATE TABLE IF NOT EXISTS user_question_stats ( user_id INTEGER NOT NULL REFERENCES users(id), question_id TEXT NOT NULL REFERENCES questions(id) ON DELETE CASCADE, times_seen INTEGER NOT NULL DEFAULT 0, times_correct INTEGER NOT NULL DEFAULT 0, last_seen_at DATETIME, PRIMARY KEY (user_id, question_id) ); CREATE TABLE IF NOT EXISTS sessions ( token TEXT PRIMARY KEY, data BLOB NOT NULL, expiry INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_sessions_expiry ON sessions(expiry); CREATE INDEX IF NOT EXISTS idx_test_answers_test ON test_answers(test_id); CREATE INDEX IF NOT EXISTS idx_answers_question ON answers(question_id); CREATE INDEX IF NOT EXISTS idx_stats_user ON user_question_stats(user_id);