2009-09-29 1 views
0

В моем текущем проекте у нас появился довольно необычный запрос (для меня). Клиент хочет, чтобы вся процедура удаления маркировала флаг, а не физически удаляла запись из таблицы базы данных. На первый взгляд это выглядит довольно легко. Я просто изменитьМарк «удалил» вместо физического удаления с помощью 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 есть что-то встроенное для обработки этого. Может ли кто-нибудь сказать мне, каков правильный подход к этой проблеме?

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

ответ

2

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

+0

Спасибо за быстрый ответ. он чувствует себя хорошо, обнаруживает, что даже такие большие имена, как ayende, имеют такую ​​же озабоченность, как и моя :) –

2

Это довольно распространено и называется «soft delete». Here's an implementation для NHibernate.

+0

Спасибо Маурисио, я попытался отметить ваш ответ как ответ, но система разрешает только один ответ. Поэтому я должен идти хронически, а ответ cbp - примерно на 1 минуту раньше. Спасибо за ответ. –

+0

Итак, вот выдержка, чтобы хотя бы дать вам некоторую сумму * rep * от принятия, если не пометить сам :-) – paxdiablo

+0

Вот что я сделал :) –

1

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

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