Я могу относиться к «размышлениям об этом слишком долго». Когда эта мысль приходит мне в голову, я отступаю и работаю над другими частями кода. Взаимоотношения, кажется, проявляются с течением времени, поскольку они действительно удобны, чтобы избавить нас от написания кода. Они не являются необходимыми, поэтому, по крайней мере, на этапе разработки, мы можем отложить объявление отношений и посмотреть, что нам нужно, чуть позже.
Да, по мнению прагматиков, мы всегда должны знать заранее, но в реальной жизни нам часто приходится использовать наш здравый смысл и опыт и создавать работающий прототип, а затем тонко настраивать его. Именно на этой стадии тонкой настройки я настраиваю свои отношения, которые раньше были не совсем ясны, и корректирую свой код.
Нюхать ... нюхать ... господи, теперь мои боссы знают, что я не идеален ... нюхать ....
Возвращаясь к рассматриваемому вопросу: обычно для блокировок, предотвращающих случайное (или умышленное) удаление, я создаю логическое поле в моей основной таблице и, если эта запись должна быть очищена, задайте для нее значение true. Для того, что вы делаете, я бы, вероятно, полностью избавился от поля флага и имел бы отдельную таблицу, в которой указаны идентификаторы блокируемых записей, а также идентификаторы пользователей, которые хотят сохранить запись. Удалите записи этих пользователей, если / когда они думают, что пришло время удалить запись. Когда пришло время провести некоторую чистку, я бы проверил эту таблицу. Нечто похожее на:
delete from table1 where id not in (select distinct(table1_id) from table2)
Что мне не нравится в этом, так это то, что есть возможность иметь еще одну таблицу, заполненную записями «вести эту запись», и именно тогда я добавляю еще одну таблицу, чтобы пользователи, которые не могут решить, какие вещи должны быть удалены .