управление версиями данных в базе данных postgres - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть база данных, содержащая вопросы и тесты (в основном список вопросов).Учителя могут создавать / обновлять / удалять вопросы, и они могут использоваться любым учителем для создания тестов.

Скажем, Алиса создает вопрос, а Боб использует его для своего теста.Если Алиса вернется и изменит свой вопрос, это изменит тест Боба, а Бобу это не понравится.

Чтобы решить проблему, я подумываю добавить номер версии к вопросам и использовать его какпервичный ключ.

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, поэтому я могу действовать соответственно в зависимости от результата? Что-то вроде «удаления пробного запуска»?

1 Ответ

0 голосов
/ 20 сентября 2019

У вас должен быть первичный ключ в таблице questions на (id, version), верно?

Для этого потребуется, чтобы у вас были оба столбца в test_questions.

Об избавлениистарых версий вопросов я бы сделал следующее:

  • При добавлении новой версии вопроса попытайтесь удалить все остальные версии того же вопроса.

  • Поймать и игнорировать любые ошибки класса foreign_key_violation (SQLSTATE 23503).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...