-- SSCTopper Database Schema -- Complete SSC CGL Question Bank CREATE TABLE IF NOT EXISTS subjects ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, tier TEXT NOT NULL, description TEXT, target_questions INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS subtopics ( id INTEGER PRIMARY KEY AUTOINCREMENT, subject_id INTEGER NOT NULL, name TEXT NOT NULL, description TEXT, FOREIGN KEY (subject_id) REFERENCES subjects(id), UNIQUE(subject_id, name) ); CREATE TABLE IF NOT EXISTS topics ( id INTEGER PRIMARY KEY AUTOINCREMENT, subtopic_id INTEGER NOT NULL, name TEXT NOT NULL, description TEXT, FOREIGN KEY (subtopic_id) REFERENCES subtopics(id), UNIQUE(subtopic_id, name) ); CREATE TABLE IF NOT EXISTS question_types ( id INTEGER PRIMARY KEY AUTOINCREMENT, topic_id INTEGER NOT NULL, name TEXT NOT NULL, FOREIGN KEY (topic_id) REFERENCES topics(id), UNIQUE(topic_id, name) ); CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_type_id INTEGER NOT NULL, question_text TEXT NOT NULL, option_a TEXT NOT NULL, option_b TEXT NOT NULL, option_c TEXT NOT NULL, option_d TEXT NOT NULL, correct_option TEXT NOT NULL CHECK(correct_option IN ('A','B','C','D')), explanation TEXT, difficulty INTEGER DEFAULT 1 CHECK(difficulty BETWEEN 1 AND 3), year_appeared TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (question_type_id) REFERENCES question_types(id) ); -- Performance indexes CREATE INDEX IF NOT EXISTS idx_questions_type ON questions(question_type_id); CREATE INDEX IF NOT EXISTS idx_questions_difficulty ON questions(difficulty); CREATE INDEX IF NOT EXISTS idx_topics_subtopic ON topics(subtopic_id); CREATE INDEX IF NOT EXISTS idx_subtopics_subject ON subtopics(subject_id); CREATE INDEX IF NOT EXISTS idx_qtypes_topic ON question_types(topic_id); -- User Management CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Progress Tracking (Question level) CREATE TABLE IF NOT EXISTS user_answers ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, question_id INTEGER NOT NULL, is_correct BOOLEAN NOT NULL, time_taken REAL DEFAULT 0.0, answered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (question_id) REFERENCES questions(id) ); CREATE INDEX IF NOT EXISTS idx_user_answers_user ON user_answers(user_id); CREATE INDEX IF NOT EXISTS idx_user_answers_question ON user_answers(question_id);