-- Know Foolery Database Schema -- SQLite Database for the quiz game -- Create themes table CREATE TABLE IF NOT EXISTS themes ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL UNIQUE, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create questions table CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, theme_id INTEGER NOT NULL, question_text TEXT NOT NULL, correct_answer TEXT NOT NULL, hint TEXT, difficulty_level INTEGER DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (theme_id) REFERENCES themes(id) ON DELETE CASCADE ); -- Create players table CREATE TABLE IF NOT EXISTS players ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create game sessions table CREATE TABLE IF NOT EXISTS game_sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, player_id INTEGER NOT NULL, started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ended_at TIMESTAMP, total_score INTEGER DEFAULT 0, questions_answered INTEGER DEFAULT 0, session_duration INTEGER DEFAULT 0, FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE CASCADE ); -- Create game answers table CREATE TABLE IF NOT EXISTS game_answers ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id INTEGER NOT NULL, question_id INTEGER NOT NULL, attempt_number INTEGER NOT NULL, user_answer TEXT, is_correct BOOLEAN DEFAULT FALSE, hint_used BOOLEAN DEFAULT FALSE, points_earned INTEGER DEFAULT 0, answered_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (session_id) REFERENCES game_sessions(id) ON DELETE CASCADE, FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE ); -- Create indexes for better performance CREATE INDEX IF NOT EXISTS idx_questions_theme_id ON questions(theme_id); CREATE INDEX IF NOT EXISTS idx_game_sessions_player_id ON game_sessions(player_id); CREATE INDEX IF NOT EXISTS idx_game_answers_session_id ON game_answers(session_id); CREATE INDEX IF NOT EXISTS idx_game_answers_question_id ON game_answers(question_id); CREATE INDEX IF NOT EXISTS idx_game_sessions_ended_at ON game_sessions(ended_at); -- Create leaderboard view CREATE VIEW IF NOT EXISTS leaderboard AS SELECT p.name as player_name, gs.total_score, gs.questions_answered, gs.ended_at, gs.session_duration FROM game_sessions gs JOIN players p ON gs.player_id = p.id WHERE gs.ended_at IS NOT NULL ORDER BY gs.total_score DESC, gs.ended_at ASC;