#247

Карантин для данных вместо удаления

Дело в том, что удаление данных — относительно дорогая процедура для большинства систем хранения данных. Представь себе, что должно произойти, чтобы удалить запись 130 из 100,000: нужно перезаписать все следующие за ней 99,870 записей. Это дорого. Поэтому базы не удаляют данные, пока их об этом не попросят.

И ты не удаляй, а положи в карантин. Заведи для записи флажок isDeleted, а еще лучше дату deletedAt, и в случае "удаления" — выставляй ее. В коде тебе нужно будет везде делать выборки с учетом этого поля.

Практически всегда так дешевле, чем реально что-то удалять.

Раз в какое-то время нужно вычищать удаленные записи. Для этого создавай новую табличку, куда переноси все актуальные данные, а затем просто удали старую и переименуй новую.

Разумеется, это касается не всех систем хранения. Но даже на локальной файловой системе может оказаться что дешевле не удалять файлики, а раз в какое-то время удалять всю fs. В случае ext3/ext4 это точно так, увы.

Кроме того, подход "recycle bin" еще и важен с точки зрения бизнес-логики: нередко бывают ситуации, когда нужно либо восстанавливать удаленные данные, либо сверяться с ними. Частный случай: удаляем пользовательский емейл, но еще месяц проверяем по нему уникальность.

Отдельную сложность представляет GDPR, т.к. по запросу данные нужно точно удалить, но в таком случае в определенных форматах я перезаписываю приватные данные нулями.