Sql 数据库记录的物理与逻辑(硬与软)删除?

Sql 数据库记录的物理与逻辑(硬与软)删除?,sql,database,database-design,soft-delete,hard-delete,Sql,Database,Database Design,Soft Delete,Hard Delete,与实际或物理删除记录相比,对记录进行逻辑/软删除(即设置一个表明该记录已删除的标志)有什么好处 这是惯例吗 这是安全的吗?优点是您可以保留历史记录(有利于审核),并且不必担心通过数据库中引用要删除行的各种其他表级联删除。缺点是您必须对任何报告/显示方法进行编码,以考虑标志 如果这是一种常见的做法,我会说是的,但对于任何事情,您是否使用它取决于您的业务需要 编辑:考虑另一个不利因素-如果表上有唯一的索引,则删除的记录仍将占用“一”条记录,因此您也必须对这种可能性进行编码(例如,在用户名上有唯一索引

与实际或物理删除记录相比,对记录进行逻辑/软删除(即设置一个表明该记录已删除的标志)有什么好处

这是惯例吗


这是安全的吗?

优点是您可以保留历史记录(有利于审核),并且不必担心通过数据库中引用要删除行的各种其他表级联删除。缺点是您必须对任何报告/显示方法进行编码,以考虑标志

如果这是一种常见的做法,我会说是的,但对于任何事情,您是否使用它取决于您的业务需要


编辑:考虑另一个不利因素-如果表上有唯一的索引,则删除的记录仍将占用“一”条记录,因此您也必须对这种可能性进行编码(例如,在用户名上有唯一索引的用户表;删除的记录仍然会阻止删除的用户用户名以获取新记录。解决这个问题,您可以在删除的用户名列上附加一个GUID,但这是一个非常粗糙的解决方法,我不推荐使用。在这种情况下,最好只使用rule用户名一旦被使用,就永远不能被替换。)

我通常使用逻辑删除-我发现,当您还间歇地将“已删除”数据归档到归档表(如果需要,可以对其进行搜索)中时,逻辑删除效果很好,因此不会影响应用程序的性能


它工作得很好,因为如果你曾经被审计过,你仍然拥有数据。如果你以物理方式删除它,它就消失了。

我非常喜欢逻辑删除,尤其是对于业务线应用程序,或者在用户帐户的上下文中。我的理由很简单:通常我不希望用户能够再使用该系统(因此帐户被标记为已删除),但如果我们删除了该用户,我们将丢失他们所有的工作等等

另一种常见的情况是,用户可能会在被删除后的一段时间内被重新创建。对于用户来说,让他们的所有数据都像被删除前一样显示,而不是必须重新创建,这是一种更好的体验


我通常认为删除用户更多的是无限期地“暂停”他们。你永远不知道他们何时会合法地需要回来。

如果逻辑删除很难保证引用完整性

当表数据存在时间方面(从_DATE到_DATE有效)时,这样做是正确的

否则,将数据移动到审核表并删除记录

好的一面是:

这是一种更简单的回滚方法(如果可能的话)

很容易看出特定时间点的状态。

Re:“这安全吗?”-这取决于你的意思

如果您的意思是,通过物理删除,您将阻止任何人找到已删除的数据,那么是的,这或多或少是正确的;物理删除需要擦除的敏感数据会更安全,因为这意味着它将永久地从数据库中消失。(但是,请注意,可能存在其他有问题的数据副本,例如备份、事务日志或传输中记录的版本,例如数据包嗅探器-仅因为您从数据库中删除,并不保证它不会保存在其他地方。)

如果您的意思是,通过执行逻辑删除,您的数据更安全,因为您永远不会丢失任何数据,这也是正确的。这对于审计场景很好;我倾向于这样设计,因为它承认一个基本事实,即数据一旦生成,就永远不会真正消失当然,真正的审计场景不仅要求删除符合逻辑,而且还要求记录更新,以及更改的时间和进行更改的参与者


如果您的意思是数据不会落入任何不应该看到它的人手中,那么这完全取决于您的应用程序及其安全结构。在这方面,逻辑删除的安全性并不比数据库中的任何其他内容高或低。

在您希望保留某个内容的历史记录的情况下,它是相当标准的(例如@Jon Dewees提到的用户帐户)。如果用户要求取消删除的可能性很大,这当然是个好主意


如果您担心从查询中筛选出已删除记录的逻辑会变得混乱,并且会使查询变得复杂,那么您可以构建视图来为您进行筛选,并使用查询来解决这一问题。这将防止在报告解决方案中泄漏这些记录等。

逻辑删除是常见做法吗?是的我在很多地方都看到过这种情况。它们安全吗?这真的取决于它们是否比删除之前的数据更不安全

当我还是一名技术负责人时,我要求我们的团队保留每一条数据,当时我知道我们将使用所有这些数据构建各种BI应用程序,尽管当时我们不知道这些要求是什么。尽管从审计、故障排除和报告的角度来看这很好(这是一个B2B交易的电子商务/工具网站,如果有人使用了一个工具,即使他们的帐户后来被关闭,我们也希望记录下来),它确实有几个缺点

不利因素包括(不包括已经提到的其他因素):

  • 保留所有这些数据对性能的影响,我们需要制定各种归档策略。例如,应用程序的一个领域接近每周生成大约1Gb的数据
  • 保存数据的成本确实会随着时间的推移而增长,虽然磁盘空间很便宜,但在线和离线保存和管理数TB数据的基础设施数量是一个巨大的挑战
    IsDeleted = 20150310  //yyyyMMdd
    
    SELECT * FROM Users where UserID = 123456 and IsDeleted = 0
    
    create table mytable (
      id serial primary key,
      my_column varchar unique not null,
      deleted_at datetime
    )
    
    create table mytable (
      id serial primary key,
      my_column varchar not null,
      my_column_repetitions integer not null default 0,
      deleted_at datetime,
      unique (my_column, my_column_repetitions),
      check (deleted_at is not null and my_column_repetitions > 0 or deleted_at is null and my_column_repetitions = 0)
    )