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