数据库:删除或不删除logging
我不认为我是唯一一个想知道这个的人。 你通常对数据库行为做什么? 你喜欢从物理数据库中删除一条logging吗? 或者只是用“已删除”标志或布尔列标记logging来表示logging处于活动状态还是非活动状态?
这绝对取决于你的数据库的实际内容。 如果你正在使用它来存储会话信息,那么当会话过期(或closures)时,通过一切手段立即擦除它,你不希望这些垃圾四处闲逛。 因为它不能真正用于任何实际目的。
基本上,你需要问自己,我可能需要恢复这些信息? 就像在SO删除的问题,他们应该肯定只是被标记为“删除”,因为我们正在积极允许撤销删除。 我们也可以select显示它来select用户,而不需要额外的工作。
如果您没有积极地寻求完全恢复数据,但是仍然希望保留这些数据用于监视(或类似)目的。 我build议你(当然可能的话)找出一个聚合scheme,然后把它推到另一个表上。 这将保持您的主表清理“删除”的数据,以及保持您的次表优化监控目的(或任何你想的)。
有关时态数据,请参阅: http : //talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/
使用删除标志的优点:
- 如果您需要,您可以稍后再获取数据,
- 删除操作(更新标志)可能比删除它更快
使用删除标志的缺点:
- 在你的SQL
AND DeletedFlag = 'N'
某个地方很容易错过AND DeletedFlag = 'N'
- 数据库find你感兴趣的行之间的所有废话
- 最后,无论如何,你可能会真的想把它删掉(假设你的系统是成功的,那么当这个logging是10年的时候,在创build4分钟之后它被“删除”了)
- 它可以使它不可能使用一个自然的关键。 你可能有一个或多个删除的行与自然键和真正的行想要使用相同的自然键。
作为所有职位的补充…
但是,如果您打算将这个logging标记出来,那么请考虑制作一个视图,以便进行有效的logging。 这样可以避免在SQL查询中写入或忘记标志。 如果你认为这也是一个目的,你也可以考虑对非活动logging进行观察。
我很高兴find这个线程。 我也想知道人们对这个问题的看法。 在许多系统上,我已经实施了“标记为已删除”约15年。 每当用户打电话来说出事件被意外删除时,将其标记为未删除比重新创build或从备份还原要容易得多。
我们在rails上使用postgresql和Ruby,看起来我们可以通过两种方法之一来完成这个任务:修改rails或者添加ondelete触发器,而不是使用pl / pgsql函数来标记为已删除。 我正在倾向于后者。
至于性能命中,在大表上查看EXPLAIN-ANALYZE的结果将会很有趣,对于已删除的项目以及许多已删除的项目也是如此。
在随着时间的推移使用的系统中,我发现新用户倾向于做一些愚蠢的事情,比如偶然地删除东西。 所以当新的人在某个职位上时,他们拥有以前那个职位的所有访问权,除非没有经验。 无意中删除了一些东西,并能够快速恢复,让大家很快恢复工作。
但正如有人所说,有时你可能需要某个特定的关键,那么你需要真正删除它,然后重新创buildlogging(取消删除和修改logging)。
如果涉及个人数据,也有法律问题。 我认为这很大程度上取决于你在哪里(或数据库在哪里)以及使用条款是什么。
在某些情况下,人们可能会要求从系统中删除,在这种情况下,需要进行硬删除(或至less清除所有个人信息)。
如果涉及个人信息,我会在采取策略之前向您的法务部门查询。
我将它们标记为已删除,而不是真的删除。 然而,每隔一段时间我就把所有的垃圾清理出来,然后把它归档,所以不会导致性能下降。
如果您担心“hibernate”logging会降低数据库访问速度,则可能需要将这些行移动到另一个充当“归档”表的表中。
对于用户input/pipe理的数据,我使用了您描述的标记方法,并给予用户一个“清空垃圾箱”的界面,以便实际删除项目。