Как сохранять условия, заданные пользователем, в базу данных?

Возникла сложность с моим рабочим проектом: есть тест с нескольким количеством блоков в нем. Непосредственно по блокам есть разное количество вопросов и ответов на них. Суть в том, что на этапе создания какого-либо теста, нужно определить условие, которое будет регламентировать движение по тесту (сначала один блок, потом второй или третий в зависимости от данных ответов в первом блоке)

Пример: "Тест 1" делится на 3 блока: Блок "А", Блок "Б" и Блок "В". В Блок "А" входит 10 вопросов и в зависимости от результата пройденного Блока "А" система будет решать по заданным условиям, какой надо давать блок: Блок "Б" или Блок "В".

Подскажите, каким образом отобразить это в базе данных? Какую таблицу можно создать, чтобы сохранять туда условия заданные пользователем?


Ответы (1 шт):

Автор решения: Akina

в зависимости от результата пройденного Блока "А" система будет решать по заданным условиям, какой надо давать блок: Блок "Б" или Блок "В".

Если результат прохождения блока формализуется в единое значение-результат, по которому принимается решение, то обычная таблица (пройденный блок - пороговый результат - переход к блоку). Например:

CREATE TABLE transition (
    id INT PRIMARY KEY,
    completed_block INT,
    criteria_from INT,
    criteria_till INT,
    next_block INT
    );

INSERT INTO transition VALUES 
(1, 1, 0, 80, 2),   -- если в блоке 1 набрано от 0 до 80 баллов - перейти к блоку 2
(2, 1, 81, 100, 3), -- если в блоке 1 набрано от 81 до 100 баллов - перейти к блоку 3
(3, 2, 0, 80, -1),  -- если в блоке 2 набрано от 0 до 80 баллов - завершить тест
(4, 2, 81, 100, 3), -- если в блоке 2 набрано от 81 до 100 баллов - перейти к блоку 3
(5, 3, 0, 100, -1); -- если в блоке 3 набрано от 0 до 100 баллов - завершить тест

Ну и соответственно

SELECT COALESCE(next_block, -1)  -- получить номер блока, к которому перейти
                                 -- если запись не найдена, завершить тест
FROM transition 
WHERE completed_block = @completed_block 
AND @points_received BETWEEN criteria_from AND criteria_till;

При заполнении необходимо следить за неразрывностью цепочек прохождения тестов и отсутствием петель. Впрочем, тестировать можно и запросом, причём каждый раз, когда выполняется корректировка таблицы.

→ Ссылка