Пометьте "удалено" вместо физического удаления с помощью Castle ActiveRecord

В моем текущем проекте мы получили довольно необычный запрос (для меня). Клиент хочет, чтобы вся процедура удаления помечала флаг, а не физически удаляла запись из таблицы базы данных. С первого взгляда это выглядит довольно просто. У меня просто есть изменения

public void DeleteRecord(Record record)
{ 
    record.DeleteAndFlush();
}

public IList GetAllRecords()
{
    Record.FindAll().ToList();
}

к

public void DeleteRecord(Record record)
{ 
   record.Deleted = true;
   record.UpdateAndFlush();
}

public IList GetAllRecords()
{
    Record.FindAll().Where(x=>x.Deleted==false).ToList();
} 

Но, как после, я получаю немного времени и думаю, что еще раз. Я обнаружил, что это небольшое изменение вызовет огромную проблему в моих настройках каскада. Поскольку я довольно новичок в бизнесе Active Record. Я бы не стал доверять себе, чтобы просто изменить все CascaeEnum.Delete на CascadeEnum.SaveUpdate. Итак, я смотрю некоторые материалы здесь.

1) Является ли знак флагом вместо физического требования общим?

2) Если ответ на вопрос 1 - "Да", то я считаю, что в NHibernate есть что-то встроенное для этого. Может кто-нибудь сказать мне, что является правильным подходом для такого рода проблем?

Спасибо за ваш вклад.

3 ответа

Решение

Это называется Soft Deletes, и это очень распространено. Есть некоторые дебаты о лучшей практике - посмотрите это недавнее сообщение в блоге: http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx

Это довольно часто и называется " мягкое удаление". Вот реализация этого для NHibernate.

Это довольно распространенный запрос, и иногда он выполняется по (как минимум) двум причинам:

  1. Аудит и история. Если строка помечена как удаленная, а не физически удаленная, это означает, что информация по-прежнему доступна при необходимости (включая восстановление информации, если, например, вы случайно удалили не того клиента).
  2. Производительность - я видел системы, которые удаляют пакетным способом с помощью этого метода, чтобы они могли выполняться физически в спокойное время. Я сомневаюсь, что это необходимо с современными СУБД, но я могу видеть, как это могло быть в прошлом, если вы хотели избежать каскадного удаления в сильно перегруженных системах (конечно, вы не должны работать в такой системе в первое место). В Oracle 8 появилась функция, подобная этой, где вы можете таким образом удалять столбцы, и она будет физически удалять их только при запросе - вы не можете использовать столбец вообще, даже если информация еще не была полностью удалена. Разрешенное удаление столбца является более интенсивным, чем удаление строки, но может все же помочь.
Другие вопросы по тегам