Как хранить удаленные строки в транзакционной базе данных

Это продолжение комментария, поднятого шестнадцатеричным на одном из моих других постов. Я хочу иметь deleted_on столбец для обнаружения удаленных записей, для которых в шестнадцатеричном формате предполагается, что этот столбец является избыточным.

Вот его комментарий:

Вы собираетесь использовать deleted_xx поля, чтобы определить, что запись удалена?

imho, самый лучший и приятный способ - добавить к записи какой-либо атрибут активности с логическим типом данных (например, поле с именем ACTIVE). Таким образом, чтобы "удалить" запись, мы должны обновить значение ACTIVE поле и update_date, updated_by в одном запросе ОБНОВЛЕНИЕ. Чтобы выбрать все активные записи, мы просто должны сделать запрос, например:

ВЫБРАТЬ * ИЗ MyTable, ГДЕ АКТИВНО =1

Я знаю, что Oracle Applications используют такой подход, и я согласен

Я также прочитал следующие посты:

Мой вопрос: как установить уникальное ограничение для таблицы, которая имеет флаг isActive, как указано выше в шестнадцатеричном формате. У меня есть суррогатные ключи во всех моих таблицах. Но я хочу, чтобы столбцы с естественным ключом (то, что мы называем столбцами бизнес-ключей) имели уникальное ограничение.

Если у меня есть deleted_on поле для отслеживания удаляет, тогда я могу включить этот столбец как часть ограничения естественного ключа. Таким образом, он допускает более одной удаленной записи с одной и той же комбинацией бизнес-ключей, отличающейся только полем даты delete_on.

Если у меня есть isActive поле и использование last_updated_on столбец для отслеживания даты удаления, у меня есть 2 варианта ограничения естественного ключа

  1. Я могу включить isActive как часть моего естественного ключевого ограничения. Но это позволило бы максимально одну удаленную запись с одинаковой комбинацией бизнес-ключей.
  2. Я могу включить isActive плюс last_updated_on как часть естественного ключевого ограничения. Но я вижу, что дополнительный столбец delete_on делает это проще.

Какие-нибудь мысли? Я что-то здесь упускаю?

3 ответа

Решение

"Мой вопрос заключается в том, как установить уникальное ограничение для таблицы, имеющей флаг isActive, как предложено выше в шестнадцатеричном формате. У меня есть суррогатные ключи во всех моих таблицах. Но я хочу обеспечить столбцы с естественным ключом (то, что мы называем столбцами бизнес-ключей).) имеют уникальное ограничение.

Если у меня есть поле delete_on для отслеживания удалений, я могу включить этот столбец как часть ограничения естественного ключа. Таким образом, он допускает более одной удаленной записи с одной и той же комбинацией бизнес-ключей, отличающейся только полем даты delete_on. "

Даже если в поле вашего естественного ключа удалено поле DATE, вы все равно не сможете удалить-заново вставить-удалить все в один и тот же день. Может показаться патологическим, но можете ли вы быть уверены, что патологический случай НИКОГДА не произойдет?

Если ваша база данных должна отражать тот факт, что часть контента является "активной" в том смысле, что она очень актуальна для текущего бизнеса, а некоторая другая информация является "неактивной", например, в том смысле, что единственной причиной время для архивных целей, а затем проектируйте свою базу данных, чтобы отразить этот факт, определив две таблицы: одну с "активным" контентом и одну с "архивированным" контентом. Возможно, вы можете использовать триггер для автоматического перехода в архив при каждом удалении.

Таким образом, вы можете использовать свой естественный ключ в СУБД с использованием уникального ограничения на "активную" таблицу, и вы можете включить метку удаления в таблицу "архив", и вам может даже не понадобиться определять какой-либо ключ в все на этом столе.

Как насчет добавления "ВЕРСИЯ" (целое число) вместо столбца ACTIVE?

  • Текущая (активная, не удаленная) версия - 0
  • Всякий раз, когда вы заменяете текущую версию новой, вы ОБНОВЛЯЕТЕ все существующие строки, заменяя VERSION на VERSION-1 (таким образом, текущая версия становится -1, ранее текущая версия становится -2 и т. Д.), Затем ВСТАВЛЯЕТ новую текущую запись с VERSION=0,

Конечно, это поле версии может быть частью естественного ключа.

Я собирался написать большое эссе, когда я вспомнил, что я уже написал его в
Есть ли проблемы с этим решением "Soft Delete" с использованием таблиц EAV?
Если вам нужен простой способ отменить удаление или сохранить запись об удалениях для аудита / устранения неполадок, использование зеркальной таблицы - простое решение.

и Soft delete лучшие практики (PHP/MySQL)
Вам нужно подумать о том, что на самом деле означает "удалить". Кажется, вы хотите иметь возможность восстановить историю, и в этом случае термин "удалить" вызывает путаницу. Это действительно не удаление. Вместо этого вы хотите использовать какую-то временную модель данных и представить концепцию действующих дат.

Или, если вам важны только объемы данных, простой пакетный процесс для УДАЛЕНИЯ или перемещения строк старше X дней / лет также является действительно простым способом.

Другие вопросы по тегам