Есть некоторые похожие вопросы по теме, но они мне особо не помогают.
Я хочу реализовать функцию мягкого удаления, как в StackOverflow, где элементы на самом деле не удаляются, а просто скрываются. Я использую базу данных SQL. Вот 3 варианта:
Добавьте
is_deleted
логическое поле.- Advantages: Simple.
- Недостатки: Нет записи даты. Заставляет меня добавлять
is_deleted = 0
в каждый запрос.
Добавьте поле даты
deleted_date
. Это установлено наNULL
, если оно не удалено.- Advantages: Has date.
- Недостатки: Все еще загромождает мои запросы.
Для обоих вышеперечисленных
- Это также повлияет на производительность, потому что есть все эти бесполезные строки. Их все еще нужно поддерживать в индексах. Также индекс в столбце
deleted
не поможет при извлечении неудаленных (большинства) строк. Необходимо полное сканирование таблицы.
Другой вариант — создать отдельную таблицу для хранения удаленных элементов:
- Преимущества: повышена производительность при запросе неудаленных строк. Не нужно добавлять условия к моим запросам на неудаленные строки. Легче поддерживать индекс.
- Недостатки: Сложность: требуется миграция данных как для удаления, так и для восстановления. Нужны новые таблицы. Со ссылочной целостностью сложнее справиться.
Есть ли лучший вариант?