54 lines
2.3 KiB
SQL
54 lines
2.3 KiB
SQL
CREATE TABLE test (
|
|
id SERIAL PRIMARY KEY,
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
total_questions INT DEFAULT 0,
|
|
duration_minutes INT DEFAULT 120,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE part (
|
|
id SERIAL PRIMARY KEY,
|
|
test_id INT NOT NULL REFERENCES test(id) ON DELETE CASCADE,
|
|
part_number INT NOT NULL,
|
|
title VARCHAR(100) NOT NULL,
|
|
question_count INT DEFAULT 0,
|
|
display_order INT DEFAULT 0,
|
|
UNIQUE (test_id, part_number)
|
|
);
|
|
|
|
CREATE TABLE tag (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL UNIQUE
|
|
);
|
|
|
|
CREATE TABLE part_tag (
|
|
part_id INT NOT NULL REFERENCES part(id) ON DELETE CASCADE,
|
|
tag_id INT NOT NULL REFERENCES tag(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (part_id, tag_id)
|
|
);
|
|
|
|
CREATE TABLE question_group (
|
|
id SERIAL PRIMARY KEY,
|
|
part_id INT NOT NULL REFERENCES part(id) ON DELETE CASCADE,
|
|
audio_url VARCHAR(500),
|
|
image_url VARCHAR(500),
|
|
passage_text TEXT,
|
|
display_order INT DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE question (
|
|
id SERIAL PRIMARY KEY,
|
|
group_id INT NOT NULL REFERENCES question_group(id) ON DELETE CASCADE,
|
|
question_number INT NOT NULL,
|
|
question_text TEXT,
|
|
display_order INT DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE answer_choice (
|
|
id SERIAL PRIMARY KEY,
|
|
question_id INT NOT NULL REFERENCES question(id) ON DELETE CASCADE,
|
|
value CHAR(1) NOT NULL CHECK (value IN ('A', 'B', 'C', 'D')),
|
|
label_text TEXT,
|
|
is_correct BOOLEAN NOT NULL DEFAULT FALSE
|
|
); |