You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.6 KiB
SQL

-- 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;