Дело в том, что удаление данных — относительно дорогая процедура для большинства систем хранения данных. Представь себе, что должно произойти, чтобы удалить запись 130 из 100,000: нужно перезаписать все следующие за ней 99,870 записей. Это дорого. Поэтому базы не удаляют данные, пока их об этом не попросят.
И ты не удаляй, а положи в карантин. Заведи для записи флажок isDeleted
, а еще лучше дату deletedAt
, и в случае "удаления" — выставляй ее. В коде тебе нужно будет везде делать выборки с учетом этого поля.
Практически всегда так дешевле, чем реально что-то удалять.
Раз в какое-то время нужно вычищать удаленные записи. Для этого создавай новую табличку, куда переноси все актуальные данные, а затем просто удали старую и переименуй новую.
Разумеется, это касается не всех систем хранения. Но даже на локальной файловой системе может оказаться что дешевле не удалять файлики, а раз в какое-то время удалять всю fs. В случае ext3/ext4 это точно так, увы.
Кроме того, подход "recycle bin" еще и важен с точки зрения бизнес-логики: нередко бывают ситуации, когда нужно либо восстанавливать удаленные данные, либо сверяться с ними. Частный случай: удаляем пользовательский емейл, но еще месяц проверяем по нему уникальность.
Отдельную сложность представляет GDPR, т.к. по запросу данные нужно точно удалить, но в таком случае в определенных форматах я перезаписываю приватные данные нулями.