Я привык видеть строки таблицы со столбцами типа «DeletedDate», и они мне не нравятся. Само понятие «удалено» заключается в том, что запись не должна была быть сделана в первую очередь. Практически, они не могут быть удалены из базы данных, но я не хочу, чтобы они были с моими горячими данными. Логически удаленные строки, по определению, являются холодными данными, если кто-то специально не хочет видеть удаленные данные.
Кроме того, каждый написанный запрос должен специально исключать их, а индексы также должны их учитывать.
Я хотел бы увидеть изменение на уровне архитектуры базы данных и на уровне приложения: создать схему под названием «удаленный». Каждая определенная пользователем таблица имеет идентичный эквивалент в «удаленной» схеме с дополнительным полем, содержащим метаданные - пользователя, который его удалил и когда. Внешние ключи требуют создания.
Затем, удаление становится вставкой-удалением. Сначала удаляемая строка вставляется в ее «удаленную» копию схемы. Соответствующая строка в основной таблице может быть удалена. Однако необходимо добавить дополнительную логику где-то вдоль линии. Нарушения внешнего ключа могут быть обработаны.
Внешние ключи должны быть правильно обработаны. Это плохая практика, когда логически удаляется строка, но у первичной / уникальной строки есть столбцы в других таблицах, которые на нее ссылаются. Такого не должно быть. Обычное задание может удалять строки вдов (строки, первичные ключи которых не имеют ссылок в других таблицах, несмотря на наличие внешнего ключа. Это, однако, бизнес-логика.
Общее преимущество заключается в сокращении метаданных в таблице и улучшении производительности, которое она приносит. Столбец «deleteDate» говорит, что эта строка на самом деле не должна быть здесь, но для удобства мы оставляем ее там и позволяем SQL-запросу обрабатывать ее. Если копия удаленной строки хранится в «удаленной» схеме, то основная таблица с горячими данными имеет более высокий процент горячих данных (при условии, что они своевременно заархивированы) и меньше ненужных столбцов метаданных. Индексы и запросы больше не должны учитывать это поле. Чем короче размер строки, тем больше строк можно разместить на странице, тем быстрее может работать SQL Server.
Основным недостатком является размер операции. Теперь есть две операции вместо одной, а также дополнительная логика и обработка ошибок. Это может привести к большей блокировке, чем в противном случае потребовалось бы обновление одного столбца. Транзакция удерживает блокировки таблицы дольше, и в ней участвуют две таблицы. Удаление данных о производстве, по крайней мере, по моему опыту, делается редко. Тем не менее, в одной из основных таблиц 7,5% из почти 100 миллионов записей имеют запись в столбце «DeletedDate».
В качестве ответа на вопрос, приложение должно быть осведомлено о «undelete's». Для этого просто нужно сделать то же самое в обратном порядке: вставить строку из «удаленной» схемы в основную таблицу, а затем удалить строку из «удаленной схемы». Опять же, необходима дополнительная логика и обработка ошибок, чтобы избежать ошибок, проблем с внешними ключами и тому подобного.