Сначала я должен уточнить, что столбец состояния не предназначен для отражения статуса элемента реального мира, представленного записью (строкой) в таблице. Скорее, он предназначен для отображения статуса самой записи.
Он может быть простым, например, активным / неактивным, или сложным, например, «Утверждено», «Удалено», «Заблокировано», «Ожидание», «Отклонено» и т. Д. Статус может быть сохранен в столбце «логическое / короткое целое число» или в столбце с одним символом, с отображениями, такими как « true
/ 1
=» A
= Одобрено.
Основная идея заключается в том, чтобы иметь в приложении поддержку восстановления корзины, похожую на корзину, и моделировать ее в базе данных. Если есть интерфейсный графический интерфейс или другой интерфейс, который может предположительно позволить пользователю «удалять» записи, он фактически не удаляет записи в таблице, а просто меняет статус записи на «Неактивно» или «Удалено». Когда интерфейс выбирает записи, он всегда получает записи, которые соответствуют только условию, что статус «Активный» или «Одобренный».
Если пользователь делает ошибку, и «удаленная» запись (с точки зрения пользователя) должна быть восстановлена, администратор базы данных может легко исправить запись как активную или утвержденную, что было бы лучше, чем поиск резервных копий и, надеюсь, поиск исходной записи. там. Либо сам интерфейс может позволить пользователю просматривать удаленные записи в отдельном представлении и восстанавливать их по мере необходимости, либо даже окончательно удалять их (удаляя фактическую запись).
Мои вопросы:
- Это хорошая практика или плохая практика?
- Влияет ли это на нормализацию данных?
- Каковы потенциальные подводные камни?
- Есть ли альтернативный метод достижения той же цели? (смотрите примечание)
- Как можно заставить базу данных применять уникальные ограничения к данным только для определенного статуса (но разрешить любое количество дубликатов для других статусов)?
- Почему базы данных не предоставляют функцию, похожую на «корзину», или отслеживание / восстановление таблиц, поэтому мы можем позволить интерфейсам без проблем удалять реальные записи?
Примечание: я читал о ведении отдельной таблицы истории, но это кажется хуже с точки зрения хранения и необходимости генерировать триггеры и поддерживать их в актуальном состоянии со схемой отслеживаемой таблицы.