0

在我当前的项目中,我们收到了一个相当不寻常的请求(对我来说)。客户端希望所有删除过程都标记一个标志,而不是从数据库表中物理删除记录。乍一看,它看起来很容易。我只有零钱

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 中内置了一些东西来处理这个问题。有人能告诉我解决这类问题的正确方法是什么吗?

感谢您的输入。

4

3 回答 3

2

这称为软删除,非常常见。关于最佳实践存在一些争论 - 查看最近的博客文章:http ://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx

于 2009-09-29T01:24:41.550 回答
2

这很常见,称为“软删除”。这是 NHibernate 的一个实现

于 2009-09-29T01:25:48.910 回答
1

这是一个相对常见的请求,有时出于(至少)两个原因而实施:

  1. 审计和历史记录- 将行标记为已删除而不是物理删除它意味着如果需要,信息仍然可用(包括信息恢复,例如,如果您不小心删除了错误的客户)。
  2. 性能- 我见过使用这种方法批量删除的系统,因此它们可以在安静的时间物理执行。我怀疑现代 DBMS 是否需要这样做,但如果您想避免在严重过载的系统上进行级联删除,我可以看到过去可能是这样的(当然,您不应该在这样的系统上运行)第一名)。Oracle 8 引入了类似这样的功能,您可以通过这种方式删除列,并且只会在您询问时物理删除它们 - 即使信息尚未完全删除,您也根本无法使用该列。授予删除列比删除行更密集,但它可能仍然有帮助。
于 2009-09-29T01:27:29.533 回答