d9de37d3d8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
1.8 KiB
SQL
60 lines
1.8 KiB
SQL
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS questions (
|
|
id TEXT PRIMARY KEY,
|
|
text TEXT NOT NULL,
|
|
source TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS answers (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
question_id TEXT NOT NULL REFERENCES questions(id) ON DELETE CASCADE,
|
|
text TEXT NOT NULL,
|
|
is_correct BOOLEAN NOT NULL,
|
|
position INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tests (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
completed_at DATETIME,
|
|
n_questions INTEGER NOT NULL,
|
|
question_ids TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS test_answers (
|
|
test_id INTEGER NOT NULL REFERENCES tests(id) ON DELETE CASCADE,
|
|
question_id TEXT NOT NULL REFERENCES questions(id),
|
|
selected_answer_id INTEGER REFERENCES answers(id),
|
|
is_correct BOOLEAN,
|
|
answered_at DATETIME,
|
|
PRIMARY KEY (test_id, question_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS user_question_stats (
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
question_id TEXT NOT NULL REFERENCES questions(id) ON DELETE CASCADE,
|
|
times_seen INTEGER NOT NULL DEFAULT 0,
|
|
times_correct INTEGER NOT NULL DEFAULT 0,
|
|
last_seen_at DATETIME,
|
|
PRIMARY KEY (user_id, question_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
token TEXT PRIMARY KEY,
|
|
data BLOB NOT NULL,
|
|
expiry INTEGER NOT NULL
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_expiry ON sessions(expiry);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_test_answers_test ON test_answers(test_id);
|
|
CREATE INDEX IF NOT EXISTS idx_answers_question ON answers(question_id);
|
|
CREATE INDEX IF NOT EXISTS idx_stats_user ON user_question_stats(user_id);
|