relational-database - 软删除与数据库存档

标签 relational-database soft-delete

推荐阅读

  • 类似:Are soft deletes a good idea?
  • 好文章:http://weblogs.asp.net/fbouma/archive/2009/02/19/soft-deletes-are-bad-m-kay.aspx

    我是如何走到这里的

    我坚信,在制作软件时,为了减少后期工作量而预先完成的任何事情都会在卡车装载时得到返回。因此,我试图确保在接近我的数据库模式和维护时,它可以保持关系完整性,同时又不会过时或过于复杂。

    在查看典型的删除方法 CASCADE 时,这导致了一种不寒而栗。哎呀,对于我目前的情况来说有点过分了。我想保持关系图的完整性,但我不想仅仅因为链的一部分不相关而删除每个图。因此,我选择采用软删除的方式来确保数据完整性得以保留,同时记录可以从相关性中删除。我通过向数据库中的每个表添加“DateDeleted”字段来完成此操作。

    转折点

    然而,这显然开始增加太多的复杂性和工作是值得的。我在不应该去的地方包含了逻辑,并且不想在我的整个应用程序中延续这些不良做法。简而言之,我将回滚这个实现。

    在查找天气时人们是否喜欢软删除,似乎有很多人支持它。事实上,链接的“类似”发布了顶级运动的“我总是软删除”的最高投票答案。此外,那里和周围的大多数答案都包括某种“isDeleted”或“isActive”类型的方法。

    新的实现思路

    “好文章”链接涵盖了我实际开始遇到的一些问题。它还提出了一种替代软删除的方法,我从最佳实践的角度发现了这一点。建议是使用“存档数据库”,我在查看软删除时实际上已经考虑过。我决定反对它的原因是因为我之前提出的关于 CASCADE 删除的观点。我很谨慎地从数据库中删除整个图形,因为链的一部分被删除了。然而,这个图表至少可以从文件中保留下来,所以我不确定它是否真的那么糟糕。

    十字路口

    那么,我应该继续添加逻辑,逻辑,逻辑......逻辑吗?或者,我是否应该考虑制作存档数据库,其中大部分逻辑都只是放在一个非常复杂的图形管理类中来存储/恢复关系对象图形?后者对我来说似乎是最佳实践。
  • 最佳答案

    理论上,软删除绝对是一种简单的方法。但是,对于如何处理未删除的数据并没有给予太多关注。事实上,它被掩盖了。

    在我看来,这是因为聚焦错误的问题。不仅仅是“删除是什么意思”,还有正在删除的内容。当要删除一条记录时,真正要删除的是图中的一个节点——而不仅仅是一条记录。整个图形完整性是人们用“软删除”解决问题的原因。这些创可贴解决方案往往会将坏疽隐藏在下面 - 一个恶化的问题,随着时间的推移只会变得更糟。

    更糟糕的是,为了配合软删除逻辑,必须包含所有内容(多次违反各种约定并实现反模式)以解决对象图中可能出现的中断。而且,“isDeleted”是什么业务逻辑?!

    我相信这个问题的一个非常强大的解决方案,即在保留对象图的参照完整性的同时删除对象的问题,是使用归档模式。删除对象时,对象会被归档,然后被删除。归档数据库,一个带有元数据的镜像数据库(可以使用时态数据库设计并且在此处非常相关),然后将接收要归档的对象并在必要时恢复。

    这使得避免列出或包含已删除对象变得非常直接,因为相关数据库将不再保存它。现在,用于查找“isDeleted”、“isActive”或“DeletedDate”的相同逻辑可以在正确的位置(不是所有地方)应用于检索到的对象的外键。当外键存在但对象不存在时,现在有一个合乎逻辑的解释和一组合乎逻辑的选项。显示包含对象已被删除和一些操作过程:“恢复、删除当前包含对象、查看已删除”。这些选项可以由用户选择,也可以以逻辑方式在代码中明确定义。根据文件数据库的先进程度,可能存在更多选项,例如谁删除了它、何时删除、为什么等等。

    关于relational-database - 软删除与数据库存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9880623/

    相关文章:

    java - 最近开始学习hibernate,有以下疑惑

    sql - 触发自动将元组添加到关系

    nosql - 将关系数据库用于无模式数据-最佳实践

    php - 软删除和恢复(MySQL、PHP)

    java - 在 hibernate 中的一个公共(public)位置进行逻辑删除

    php - SQL - 返回用户拥有的书籍

    database - 最适合我的需求的数据库是什么?

    ruby-on-rails - 即使被软删除也需要返回:name of an object,(使用偏执)

    php - 禁止软删除用户在 laravel 4 中使用 Auth 登录

    ruby-on-rails - 软删除Mongoid文档以及相关文档