数据库:删除还是不删除记录


117

我不认为我是唯一对此感到好奇的人。您通常会如何处理数据库行为?您是否更愿意从数据库中删除记录?还是只用“已删除”标志或布尔列标记记录以表示记录是活动的还是不活动的更好?


67
...数据库中的标志是否会遭受膨胀和冗余标志,还是将DELETE移到记录表,然后通过删除结束它们。删除,睡觉;
尼克

7
嘿! 我该如何对评论进行投票??
Nifle

Answers:


48

它绝对取决于数据库的实际内容。如果您使用它来存储会话信息,那么在会话过期(或关闭)时一定要立即擦除它,您不希望这些垃圾随处可见。因为它实际上不能再用于任何实际目的。

基本上,您需要问自己什么,我是否需要恢复此信息?就像SO上的已删除问题一样,由于我们正在积极允许取消删除,因此绝对应该将它们标记为“已删除”。我们也可以选择显示它,以选择用户,而无需进行过多的工作。

如果您不是积极寻求完全还原数据的方法,但仍希望保留它以用于监视(或类似目的)。我建议您(在可能的范围内)找出一个聚合方案,并将其推到另一个表中。这将使您的主表清除“已删除”的数据,并使次表保持最佳状态以进行监视(或您考虑的任何内容)。

有关时间数据,请参阅:http : //talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/


30

使用删除标志的优点:

  1. 如果需要,可以稍后再取回数据,
  2. 删除操作(更新标志)可能比真正删除它要快

使用删除标志的缺点:

  1. AND DeletedFlag = 'N'在您的SQL中很容易错过任何地方
  2. 较慢的数据库查找所有废话中您感兴趣的行
  3. 最终,您可能仍然想要删除它(假设您的系统成功。该记录已存在10年,并且在最初创建后4分钟被“删除”了怎么办)
  4. 这可能导致无法使用自然键。您可能有一个或多个带有自然键的已删除行,而一个真实的行想要使用同一自然键。
  5. 可能出于法律/合规原因,您实际上打算删除数据。

23

作为所有帖子的补充...

但是,如果您打算标记该记录,则可以考虑对活动记录进行查看。这样可以避免编写或忘记SQL查询中的标志。如果您认为非活动记录的视图也可以起到一定作用,那么您也可以考虑该视图。


11

我很高兴找到这个线程。我也想知道人们对这个问题的看法。我已经在许多系统上实施了“标记为已删除”大约15年。每当用户打电话说某事被意外删除时,将其标记为未删除肯定比重新创建或从备份还原要容易得多。

我们正在使用postgresql和Ruby on Rails,看起来我们可以通过以下两种方式之一来执行此操作:修改Rails或添加ondelete触发器,而是使用pl / pgsql函数将其标记为已删除。我倾向于后者。

至于性能方面的问题,有趣的是,在大表上看到EXPLAIN-ANALYZE的结果,删除的项目很少,删除的项目很多。

在我发现随着时间推移而使用的系统中,新用户往往会做一些愚蠢的事情,例如意外删除。因此,当某人是新手时,除了零经验外,他们都拥有该人以前的所有访问权限。意外删除某些内容并能够快速恢复,使每个人都能快速恢复工作。

但是正如某人所说,有时出于某种原因您可能需要返回特定的密钥,这时您需要真正将其删除,然后重新创建记录(取消删除并修改记录)。


1
+1是因为用户友好性限制了我做出灾难性错误的能力。
杰西2014年

6

如果涉及个人数据,则无论哪种方式都存在法律问题。我认为这很大程度上取决于您所在的位置(或数据库的位置)以及使用条款。

在某些情况下,人们可能会要求将其从您的系统中删除,在这种情况下,需要硬删除(或至少清除所有个人信息)。

如果涉及个人信息,则在采取任何一种策略之前,我都会先咨询您的法律部门。


5

我将它们标记为已删除,但实际上并没有删除。但是,我偶尔会清除所有垃圾并将其存档,因此不会影响性能。


2

如果您担心“休眠”记录会减慢数据库访问速度,则可能需要将这些行移动到充当“归档”表的另一个表中。


1

对于用户输入/管理的数据,我使用了您描述的标志方法,并为用户提供了“清空垃圾箱”界面,以便在用户选择删除项目时实际删除它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.