软删除 vs. 数据库归档

9

推荐阅读

  • 类似问题:软删除是个好主意吗?
  • 好文章:http://weblogs.asp.net/fbouma/archive/2009/02/19/soft-deletes-are-bad-m-kay.aspx
  • 我为什么会来到这里

    我坚信,制作软件时,任何早期的工作都能在以后的工作中大量减轻负担。因此,在处理数据库架构和维护时,我试图确保它能维护关系完整性,同时又不过时或过于复杂。

    这导致了我对典型的删除方法(CASCADE)感到惊慌失措。哇,这有点过头了。在我的当前情况下,我想维护关系图形的完整性,但我不想因为链中的一部分无关紧要而删除每个图形。因此,我选择了采用软删除方式,以确保数据完整性得到维护,同时可以从相关性方面删除记录。我通过向数据库中的每个表添加“DateDeleted”字段来实现这一点。

    转折点

    然而,这显然开始增加太多的复杂性和工作量,不值得。我正在包含不应该存在的逻辑,并且不希望在整个应用程序中延续这些不良惯例。简而言之,我将回滚此实现。

    当查找人们是否喜欢软删除时,似乎有很多支持它的人。事实上,顶部投票答案为“我总是软删除”的链接“类似”文章。此外,在那里和SO周围的大多数答案都包括某种“isDeleted”或“isActive”类型的方法。

    新实现想法

    所链接的“好文章”涵盖了我实际遇到的一些问题。从最佳实践的角度来看,它还提出了软删除的替代方案,我认为非常准确。建议使用“归档数据库”,我实际上在考虑软删除时就已经考虑过这一点。我决定反对它的原因是我之前关于CASCADE删除的观点。我不愿意从数据库中删除整个图形,因为链的一部分被删除了。然而,这个图形至少可以从归档中保留,所以我不确定它是否真的那么可怕。

    十字路口

    因此,我应该继续添加逻辑、逻辑、逻辑....逻辑吗?还是应该考虑创建归档数据库,让大部分逻辑仅在一个非常复杂的图形管理类中存储/恢复关系对象图形?对我来说,后者似乎是最佳实践。

    1个回答

    9
    软删除在理论上确实是一种简单的方法。然而,很少有人关注未被删除的数据该如何处理。事实上,这个问题被掩盖了。
    我认为这是因为关注点不正确。不只是"删除意味着什么",而是正在被删除的内容是什么。当要删除一个记录时,真正被删除的是图中的一个节点——而不仅仅是一个单独的记录。整个图形的完整性是人们使用"软删除"来应对问题的原因。这些临时解决方案倾向于隐藏底层的腐败问题——随着时间的推移这个问题会变得越来越糟糕。
    更糟糕的是,在所有地方都必须包含软删除逻辑,以便应对对象图中可能出现的问题,这常常打破各种约定并实施反模式。此外,"isDeleted"是什么样的业务逻辑?!
    我认为解决这个问题的一个非常强大的解决方案,即解决删除对象同时保留对象图参考完整性的问题,是使用存档模式。在删除对象时,将对象存档后再删除。归档数据库是一个具有元数据的镜像数据库(可以使用时间数据库设计,并且在这里非常相关),接下来将接收要存档和恢复的对象。
    这样就可以直接避免将已删除的对象列入或包含在相关数据库中。现在,同样的逻辑,即寻找"isDeleted"、"isActive"或"DeletedDate",可以应用于检索对象的外键的正确位置(而不是到处都是)。当存在外键但不存在对象时,现在有了一个逻辑上的解释和一组逻辑选项。显示包含对象已被删除并采取某些操作: "恢复,删除当前包含对象,查看已删除的对象"。这些选项可以由用户选择,也可以以一种逻辑方式在代码中明确定义。根据归档数据库的先进程度,可能还存在更多选项,例如谁删除了它、什么时候、为什么等等。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接