У меня есть база данных, содержащая вопросы и тесты (в основном список вопросов).Учителя могут создавать / обновлять / удалять вопросы, и они могут использоваться любым учителем для создания тестов.
Скажем, Алиса создает вопрос, а Боб использует его для своего теста.Если Алиса вернется и изменит свой вопрос, это изменит тест Боба, а Бобу это не понравится.
Чтобы решить проблему, я подумываю добавить номер версии к вопросам и использовать его какпервичный ключ.
table Questions:
version integer primary key
id integer -- shared by the multiple revisions of the question
owner integer
table Tests:
id integer primary key
owner integer
table Test_Questions:
question integer references Questions ON DELETE RESTRICT
test integer references Tests ON DELETE CASCADE
Теперь, когда Алиса обновляет свой вопрос, в таблице Вопросы создается новая строка, и тест Боба остается неизменным.Хорошо, но теперь у меня есть проблема с потраченным впустую пространством: я не хочу оставлять сотни ревизий, на которые есть реальная ссылка нигде.Поэтому при обновлении вопроса я бы лучше проверил, есть ли на него ссылка где-либо, если да, то создайте новую ревизию, если не обновите на месте.
Я думаю, что ограничение "ON DELETE RESTRICT" могло бы помочь мне здесь: если на мой вопрос ссылаются где-либо, я не смогу удалить его, поэтому я мог бы попытаться удалить его, и в зависимости от результата заново вставить его с тем же номером ревизии или с новым.Но это не так.
Наверное, мой вопрос: Есть ли способ проверить, будет ли ограничение ON DELETE RESTRICT нарушено DELETE, поэтому я могу действовать соответственно в зависимости от результата? Что-то вроде «удаления пробного запуска»?