Files
qbank/internal/db/schema.sql
T
Jānis Kacēns 5199c1fa16 Phase 4: upload, LLM extraction, import review flow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 13:15:04 +03:00

68 lines
2.0 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 TABLE IF NOT EXISTS import_drafts (
id TEXT PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
source TEXT NOT NULL DEFAULT '',
questions TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
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);