2009-09-29 88 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 delete”。这对NHibernate的Here's an implementation

+0

谢谢Mauricio,我试图将您的答复标记为答案,但系统只允许一个答案。所以我得慢慢去,cbp的回复大概早了1分钟。感谢你的回答。 – 2009-09-29 01:52:44

+0

所以这里至少给你一些接受的*代表*,如果不是蜱自身:-) – paxdiablo 2009-09-29 02:14:33

+0

这就是我做的:) – 2009-09-29 02:35:58

1

这是一个比较普遍的要求,它有时也被用于(至少)有两个原因来实现:

  1. 审计和历史 - 标记为删除而不是物理删除它意味着信息的行仍可如果需要(包括恢复信息,例如,如果您意外删除了错误的客户)。
  2. 性能 - 我见过使用此方法批量删除的系统,因此可以在安静的时间进行物理执行。我怀疑这是现代数据库管理系统所需要的,但是如果你想避免在严重超负载的系统上级联删除,我可以看到过去的情况如何可能如此(当然,你不应该在这样的系统上运行系统在第一位)。 Oracle 8引入了这样的功能,您可以按照这种方式删除列,并且只有在您询问时才能删除它们 - 即使信息尚未完全删除,您也无法使用该列。授予删除列比删除行更强烈,但它可能仍然有帮助。