Почему сущности помечаются на удаление и переносятся в архив по ночам, а не удаляются сразу?
Что проверяют
Понимаете ли вы, что удаление это бизнес-операция, а не строчка DELETE, и видите ли последствия такого решения для интерфейса. Вопрос архитектурный, но от фронтенда ждут своей части ответа.
Как отвечать
Причины пометки вместо немедленного удаления:
- откат: пользователь ошибся, и отмена должна занимать секунды, а не заявку на восстановление из резервной копии;
- связи: на сущность ссылаются заказы, документы, история. Физическое удаление либо уносит каскадом эту историю, либо ломает ссылки;
- аудит и хранение: нужно знать, кто и когда удалил, а часть данных обязана храниться какое-то время;
- нагрузка: массовое удаление на горячей таблице держит блокировки, перестраивает индексы и грузит репликацию, поэтому настоящую чистку уносят в ночное окно и делают пачками.
Ночной перенос в архив нужен, чтобы рабочая таблица и её индексы не росли вечно: холодные строки уезжают отдельно, а частые запросы остаются быстрыми.
Для интерфейса отсюда следует несколько вещей. Фильтр по признаку удаления живёт на сервере, а не в браузере. Счётчики и пагинация считаются по тем же условиям, что и список, иначе страница приходит короче ожидаемой. Удаление в UI это оптимистичное скрытие строки с возможностью отменить, пока висит уведомление. Отдельный сценарий это просмотр архива и восстановление, доступные не всем ролям.
Где спотыкаются
Прячут удалённое на клиенте: сервер отдаёт всё, фронтенд отфильтровывает. Пагинация и счётчики сразу начинают врать, а скрытые данные всё равно уходят в браузер и видны в ответе сети.
Второе: считают, что флаг заменяет удаление. Требование удалить персональные данные пометкой не закрывается: у архива должен быть срок жизни и процедура окончательной очистки или обезличивания.
Третье: забывают про уникальные ограничения. Пользователь удалён, регистрируется заново на тот же адрес и упирается в старую строку. Уникальность делают частичной, по условию «не удалено», а интерфейс должен показать понятную ошибку, а не общий отказ сервера.