Всем доброго времени суток!
Сразу хочу сказать, что в Django я новичок, как в целом и в программировании. Так что не судите строго. :-)
Хотел бы спросить у знающих, по поводу следующей проблемы. Проблему можно описать простым примером. Есть база данных PostgreSQL. Есть 6-ть таблиц. Первые три таблицы - это таблицы со списком авторов, вторые три таблицы - это таблицы со списком книг. Для простоты, связи между таблицами простые (нет отношений многие ко многим): у каждой книги может быть только один автор, но у автора может быть много книг. Далее, пояснение про таблицы. А именно почему их 3 для каждого типа сущности. Таблиц для авторов и для книг ровно по три, т.к. первая таблица родительская, и её унаследуют таблицы с "реальными" и "архивными" данными. Речь идёт именно про наследование таблиц в Postgres'е, а не про ORM-модели Django. При удалении данных из "реальной" таблицы, триггеры БД переносят записи в таблицу с "архивами". Структура самих таблиц полностью идентична (по сути и используется одна абстрактная модель, которая тупо три раза наследуется). Всё работает чудесно, и прекрасно. Даже каскадные удаление отрабатывают как надо (с переносом целых ветвей деревьев из "реальных" таблиц в таблицы "архивов").
Но есть, досадный эффект. Если пользователь работает с веб-интерфейсом, то он может получить ошибку при сохранении и выборки данных. Т.к., например, в момент добавления/изменения данных о книги, в параллельной транзакции может идти удаление самого автора книги. И если транзакция с удалением закончится быстрее, то, как этого и следует ожидать, обломится транзакция с добавлением/изменением данных книги (это справедливо для любого уровня изолированности транзакций Postgres). В итоге получим IntegrityError. И при выборке данных тоже может случится факап. Например, при выводе шаблона с информацией о книге, нам может потребоваться информация об авторе. Но на момент когда делается обращение к БД, что бы получить информацию об авторе, через обращение к соответствующему полю объекта ORM, в параллельном процессе в этот же момент могут удалиться нужные данные из БД. И будет возбуждено исключение ObjectDoesNotExist .
Суть вопроса в том, какая практика обычно применяется в таких случая?
Описанная проблема в моём случае более чем реальна, это совсем не взятая с потолка проблема. Т.к. записи постоянно удаляются и изменяются, примерно, по 300 запросов в секунду. Так что вероятность возникновения ошибки очень высокая.