You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.2 KiB
138 lines
5.2 KiB
-- Tesla Coil Spark Course - Database Schema
|
|
-- SQLite database for progress tracking, exercises, and user data
|
|
|
|
-- User profiles and preferences
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
email TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
last_login TIMESTAMP,
|
|
current_learning_path TEXT DEFAULT 'intermediate',
|
|
theme_preference TEXT DEFAULT 'light',
|
|
font_size INTEGER DEFAULT 14,
|
|
auto_save_enabled BOOLEAN DEFAULT 1,
|
|
show_hints BOOLEAN DEFAULT 1
|
|
);
|
|
|
|
-- Lesson progress tracking
|
|
CREATE TABLE IF NOT EXISTS lesson_progress (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
lesson_id TEXT NOT NULL,
|
|
status TEXT CHECK(status IN ('not_started', 'in_progress', 'completed')) DEFAULT 'not_started',
|
|
first_opened TIMESTAMP,
|
|
last_accessed TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
time_spent INTEGER DEFAULT 0, -- Total seconds spent
|
|
scroll_position FLOAT DEFAULT 0.0, -- 0.0 to 1.0
|
|
completion_percentage INTEGER DEFAULT 0, -- 0 to 100
|
|
completed_at TIMESTAMP,
|
|
notes TEXT,
|
|
bookmarked BOOLEAN DEFAULT 0,
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id),
|
|
UNIQUE(user_id, lesson_id)
|
|
);
|
|
|
|
-- Exercise attempts (all attempts recorded)
|
|
CREATE TABLE IF NOT EXISTS exercise_attempts (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
exercise_id TEXT NOT NULL,
|
|
lesson_id TEXT,
|
|
attempt_number INTEGER NOT NULL,
|
|
user_answer TEXT,
|
|
is_correct BOOLEAN NOT NULL,
|
|
points_earned INTEGER DEFAULT 0,
|
|
points_possible INTEGER NOT NULL,
|
|
hints_used INTEGER DEFAULT 0,
|
|
time_taken INTEGER, -- Seconds
|
|
attempted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id)
|
|
);
|
|
|
|
-- Exercise completion (best performance)
|
|
CREATE TABLE IF NOT EXISTS exercise_completion (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
exercise_id TEXT NOT NULL,
|
|
best_score INTEGER NOT NULL, -- Points earned
|
|
max_possible INTEGER NOT NULL, -- Total points available
|
|
total_attempts INTEGER DEFAULT 1,
|
|
first_attempted TIMESTAMP,
|
|
first_completed TIMESTAMP,
|
|
last_attempted TIMESTAMP,
|
|
average_time INTEGER, -- Average seconds per attempt
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id),
|
|
UNIQUE(user_id, exercise_id)
|
|
);
|
|
|
|
-- Study sessions for streak tracking
|
|
CREATE TABLE IF NOT EXISTS study_sessions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
session_date DATE NOT NULL, -- Just the date (YYYY-MM-DD)
|
|
session_start TIMESTAMP NOT NULL,
|
|
session_end TIMESTAMP,
|
|
lessons_viewed INTEGER DEFAULT 0,
|
|
lessons_completed INTEGER DEFAULT 0,
|
|
exercises_attempted INTEGER DEFAULT 0,
|
|
exercises_completed INTEGER DEFAULT 0,
|
|
points_earned INTEGER DEFAULT 0,
|
|
time_active INTEGER DEFAULT 0, -- Seconds
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id),
|
|
UNIQUE(user_id, session_date)
|
|
);
|
|
|
|
-- Achievements and badges
|
|
CREATE TABLE IF NOT EXISTS achievements (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
achievement_id TEXT NOT NULL, -- e.g., 'quick_learner', 'streak_master'
|
|
achievement_name TEXT NOT NULL,
|
|
achievement_description TEXT,
|
|
earned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
details TEXT, -- JSON with achievement specifics
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id),
|
|
UNIQUE(user_id, achievement_id)
|
|
);
|
|
|
|
-- Bookmarks and notes
|
|
CREATE TABLE IF NOT EXISTS bookmarks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
resource_type TEXT CHECK(resource_type IN ('lesson', 'example', 'reference', 'exercise')) NOT NULL,
|
|
resource_id TEXT NOT NULL,
|
|
title TEXT,
|
|
note TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id)
|
|
);
|
|
|
|
-- Learning path progress
|
|
CREATE TABLE IF NOT EXISTS learning_path_progress (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
path_id TEXT NOT NULL, -- 'beginner', 'intermediate', etc.
|
|
lessons_completed INTEGER DEFAULT 0,
|
|
total_lessons INTEGER NOT NULL,
|
|
last_lesson_id TEXT,
|
|
started_at TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(user_id),
|
|
UNIQUE(user_id, path_id)
|
|
);
|
|
|
|
-- Create indexes for performance
|
|
CREATE INDEX IF NOT EXISTS idx_lesson_progress_user ON lesson_progress(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_lesson_progress_lesson ON lesson_progress(lesson_id);
|
|
CREATE INDEX IF NOT EXISTS idx_lesson_progress_status ON lesson_progress(status);
|
|
CREATE INDEX IF NOT EXISTS idx_exercise_attempts_user ON exercise_attempts(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_exercise_attempts_exercise ON exercise_attempts(exercise_id);
|
|
CREATE INDEX IF NOT EXISTS idx_study_sessions_user_date ON study_sessions(user_id, session_date);
|
|
CREATE INDEX IF NOT EXISTS idx_achievements_user ON achievements(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bookmarks_user ON bookmarks(user_id);
|
|
|
|
-- Insert default user (for single-user desktop app)
|
|
INSERT OR IGNORE INTO users (user_id, username, email)
|
|
VALUES (1, 'Student', 'student@teslacourse.local');
|