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