Один шаблон, который я использовал, - это создание зеркальной таблицы и присоединение триггера к основной таблице, поэтому все удаления (и обновления, если необходимо) записываются в зеркальную таблицу.
Это позволяет вам "восстанавливать" удаленные / измененные записи, и вы все еще можете жестко удалять в основной таблице и сохранять ее "чистой" - это также позволяет создавать функцию "отмены", и вы также можете записывать дата, время и пользователь, который выполнил действие в зеркальной таблице (неоценимо в ситуациях охоты на ведьм).
Другое преимущество заключается в том, что нет возможности случайно включить удаленные записи при запросе к первичному серверу, если только вы сознательно не решите включить записи из зеркальной таблицы (возможно, вы захотите показать живые и удаленные записи).
Другим преимуществом является то, что зеркальная таблица может быть очищена независимо, поскольку в ней не должно быть каких-либо фактических ссылок на внешние ключи, что делает эту операцию относительно простой по сравнению с очисткой из первичной таблицы, которая использует мягкое удаление, но все еще имеет ссылочные соединения с другие таблицы.
Какие еще преимущества? - замечательно, если у вас есть куча кодеров, работающих над проектом, выполняющих чтение в базе данных со смешанными навыками и вниманием к уровням детализации, вам не нужно не спать по ночам надеясь, что один из них не забудет не включать удаленные записи (lol, Not Include Deleted Records = True), что приводит к таким вещам, как завышение, скажем, наличие у клиента наличной позиции, с которой они затем покупают некоторые акции (то есть, как в торговая система), когда вы работаете с торговыми системами, вы очень быстро узнаете ценность надежных решений, даже если они могут иметь немного больше первоначальных «накладных расходов».
Исключения:
- в качестве руководства используйте мягкое удаление для «справочных» данных, таких как пользователь, категория и т. д., и жесткое удаление в зеркальной таблице для данных «фактического» типа, то есть истории транзакций.