这个问题已经在此处有答案︰

是软删除,是个好主意或者是个好主意吗?

而不是实际删除数据库中的记录,您将只是标记为IsDeleted = true,和恢复的记录时,您可能只是其标记为False.

这是一个好主意吗?

是它物理上删除该记录,然后将其移动到存档数据库,更好的方法,如果用户希望记录后,软件将查找存档文件中的记录,然后重新创建它?

2010-03-31 01:22:44
问题评论:

我想说每个方式其良好 !

同往常一样,取决于您尝试。您要做什么?

@Brian-它们使用 shredders。

使用删除时间戳,没有标志。

我工作在一个表使用IsDeleted特性的应用程序。结果是频繁上调的 bug。问题应该是很明显︰ 每个查询常规用户想要在对表执行涉及non-deleted数据,这意味着必须添加...AND IsDeleted = 'N'对其WHERE子句。当然,通常省略︰ 任一代码编写者忘了添加它或不知道他们必须首先将其添加。当然,没有原始规范中的对此没有要求,他们计划使用的代码编写者...

回答:

我说它通常是个好主意,(有一些例外,可能是)。

首先,您的数据库应该定期备份,因此您不应在其中就会丢失数据永久删除由于 (除非它当然是删除刚刚添加的数据) 的情况下。

第二,这意味着像一个软删除您现在必须包括WHERE IsDeleted = false在此表格 (和这么多更糟,如果要加入这些表) 上的每个查询子句。一旦用户或测试人员注意到已删除的记录显示,向上,这可能要花费一些时间,会发现此处有误。此外,它可以很容易为开发人员忽略从 COUNT(*) 查询,这可能要花更长的时间来发现 WHERE 子句 (过的一个项目,这已经多年发生; 不多以往任何时候都"删除记录",这样总数已接近什么应并没有人注意到)。

最后,软删除带有人为键,将工作表上,但可能不起作用的表具有自然的主键值 (例如您""有人从表中删除由社会保险号码的键控您做什么当您是否需要重新添加他?请不要说"复合主键中包含 IsDeleted"。)。

在设计审查,则我应得到开发人员演示对成本和收益的认识和采取这种方式软删除极好原因。"为什么呢?"不是很好的一个原因。

它是相当简单创建一个视图并将其具体化,如果需要排除所有的 is_deleted 记录。相对于视图随后可运行的所有查询。从备份中恢复-说对于类似于重新启用用户帐户-您真的就不想转到要还原其数据的归档文件运行。您想要将 is_deleted 设置为 false。这是公平的基元 (而不太可能发生) 的情况下您可能需要使用已禁用的字段-但点是相同的。对于某些情况,以便能够立即恢复被删除的数据可能是值得的。

@Josh︰所有SQL 编程中都是相当微不足道;它是许多日常事物的累计启动会引起问题。我说过我的最后一句中,我期望开发人员要有充分的理由增加这种方式系统的复杂性。我很失望,但看到这么多开发人员说他们这样做当然,不管他们的应用程序的实际需求为根本不感到吃惊。

让我支持毫克。您具有一个时间戳字段。您经常范围扫描通过索引...sysdate-2 和 sysdate 之间的所有内容。如果软删除经常到范围扫描可以返回高需要被过滤掉的行的百分比。筛选 = 成本高昂,范围扫描 = 成本较低。

我不再同意这一概念在多数情况下软删除 @TravisJ。只是以免并不软删除我认为的好原因。

此外值得一提的是︰ 结合软删除一个UNIQUE索引可以使混乱的。例如,尝试注册已删除的用户名将失败,即使是不在使用中。

它永远不会是个好主意,以避免潜在的数据丢失。

我总是软删除。在需要将数据库的一个或多个记录进行清理的情况下,我通常采用软删除,然后清空"回收站"的记录或文档管理风格的做法文档记录可以离开,老化,然后经过硬删除前的审批过程的两步的过程。

系统通常仍需要的数据完整性、 审核或历史记录的更改...软删除掉 !对于实际删除等使用清理进程...PK:-)

+ 1:I always soft-delete.

所以不需要检查是否已删除其中 = 0 上每个查询中,您可以为您做的表的视图。然后,您可以进行一个名为 recycle_bin 视图或类似显示只有 (执行联合执行软删除其公共字段的表) 删除的记录

+ 1 的使用安全、 混合、 2 步骤过程

它取决于环境。我看看您是真正删除某项法律要求的情况。也许有人已经请求他们的社会安全号被永久删除从您的系统。也可能您要合并到单个记录的重复记录。保持与已删除标志挂在重复不可能有利。

另外,还有一个技术的缺点︰ 不能执行级联删除,自动清除已删除的数据,以防止外键冲突的任何参考。这不一定是一个大问题,但是这是一个需要注意的。

否则,我认为这是一个不错的主意。

问题问得好︰ 级联删除。

@UpTheCreek︰ 我认为,如果要做软删除,您需要自己处理级联删除了 DanM 的点。如果使用的硬删除操作 (我将所谓"正常"),可以让数据库本身自动执行级联删除。

@MusiGenesis-和级联的恢复呢?

+ 1 的开头"它取决于.."

如果您打算使用软删除,最好要有一个 deleted_date 字段中,而不是一个 is_deleted 字段。您得到一个不错的额外数据而不是只是位域。

+ 1 使用日期时间字段而不是位...我不得不使用"IsSomething"来管理旧系统的数量和"DateSomethinged"是 annoyingly 高...

我们最近应邀作为直接在表...列创建的 isDeleted 位要求它的值以进行管理。我们以前有这位在视图中,计算基于 deleteDate IS NOT NULL 的业务规则和 deleteDate < getdate () 函数。现在我正在 begrudgingly 作品。

@BrandonWittwer,为什么?如果您有一个first_name列中和一个last_name列中,您还要full_name列只是因为该应用程序需要有一个full_name属性,或将您计算该应用程序中?顺便说一句, deleteDate < Getdate()应成为多余。此外,不知道您的后端,或许可以实现计算所得的列使您无需管理自己维护完整性的两个单独的列。technet.microsoft.com/en-us/library/ms191250 (v=sql.105).aspx

@JoshSmeaton,您完全加图文框我的挫折。它可构成完全从同一个记录中的其他数据的数据无疑应该是视图的一部分。如果具体化意义非凡 (性能的一个因素),可以考虑计算所得的列。当然,在这种情况下,计算不是可能的因为在那里...getdate () 函数不确定性。

并从技术上讲 SomeStatusesDateField < getdate () 函数,则需要可以 postdate PublishDate 效果......= 从现在的三个星期到那时 isPublished 为假。

主要的问题之一为软删除那些不需要的数据可能会影响数据库性能。一个我的客户端请求我做几年前软删除的所有数据库项目,请为我的解决方案是将所有"已删除"项添加到备份表中,而不是将其留到当前正在运行表。

对于将数据移动到另一个表的 + 1 !

您可能改为分区表的"被"减轻影响性能,如果它可以在您的数据库中执行此操作。然后,您不必担心关于两个不同的表。

内容来源于Stack Overflow Are soft deletes a good idea? [duplicate]
请输入您的翻译

Are soft deletes a good idea? [duplicate]

确认取消