как хранить удаленные строки в транзакционной базе данных - PullRequest
3 голосов
/ 19 апреля 2011

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

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

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

imho, лучший и самый приятный способ - добавить для записи атрибут активности логического типа данных (например, поле с именем ACTIVE).Таким образом, чтобы « удалить », мы должны обновить значение полей ACTIVE и update_date, updated_by в одном запросе UPDATE.Чтобы выбрать все активные записи, нам просто нужно сделать запрос, подобный следующему:

SELECT * FROM MyTable WHERE ACTIVE = 1

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

Я также читаю следующие сообщения:

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

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

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

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

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

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

0 голосов
/ 19 апреля 2011

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

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

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

0 голосов
/ 19 апреля 2011

А как насчет добавления "VERSION" (целое число) вместо столбца ACTIVE?

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

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

...