Определения
- SOFT DELETE - не удаляет объект из базы данных, но делает это
- HARD DELETE — полностью удаляет объект из базы данных
Вопрос
Как лучше всего реализовать мягкое удаление в кодовой базе (в частности, в проекте Django)?
Я думаю, что самым простым способом было бы просто добавить:
is_deleted = models.BooleanField(default=False)
в суперкласс, который реализует softDeleteObject
, а затем переопределить delete()
, чтобы установить соответствующие флаги для рассматриваемых объектов. Связанные объекты также должны наследоваться от одного и того же суперкласса.
Вместо этого вместо этого можно было бы удалить оригинал и получить то, что составляет объект архива, который является представлением удаленных объектов.
Анализ
Первый кажется более простым, но требует некоторых широких переопределений — например, User
нужно было бы переопределить, чтобы гарантировать, что отношения внешнего ключа всех удаленных объектов все еще сохраняются, и что удаление пользователя затем не не удалить все их мягко удаленные объекты.
Второй может быть реализован с помощью сигналов pre_delete, запускающих создание суррогатных объектов. Это снова имеет некоторые преимущества (не нужно переопределять все delete()
методы), но требует реализации архивных версий моделей, используемых в проекте.
Что предпочтительнее и есть ли другие альтернативы?