【问题标题】:soft delete common attributes with regards to cascade recovery关于级联恢复的软删除通用属性
【发布时间】:2012-04-23 06:52:23
【问题描述】:

软删除一般用什么类型的字段?这些中的任何一个,还有其他的吗?

bool IsDeleted // nice because the default value is 0 (no) just in case
date DateDeleted // is this a common one?
date DateCreated // more of a temporal db aspect
date DateModified // same with respect to created

我问的原因是,在使用软删除时,仍必须实施级联以保持完整性。然而,真正的技巧不是级联删除,这很容易。

The trick is cascade restoring。在级联删除中,使用软删除方案,关系图中的所有记录都被标记为已删除、非活动,无论标志是什么,也许不同之处在于将 datedeleted 更改为 null 值。在级联恢复时,必须评估记录引用以查看它们被删除的原因是否是与正在恢复、重新激活、取消删除的记录相关的级联删除的结果。

如何处理存储数据的级联恢复操作?

【问题讨论】:

    标签: database-design theory rdbms cascade soft-delete


    【解决方案1】:

    如果您不仅要跟踪所发生事件的结果,还要跟踪何时以及为什么,人们通常使用事务记录

    事务日志表通常包含以下列:事件的日期/时间、事件的性质(插入、更新、删除……),以及执行该操作的用户和/或进程。事务日志和基表中受影响的记录之间也存在链接。这可以通过事务日志表的基表上的外键来完成,但更常见的是让事务日志包含基表的外键。如果事务日志表在各种基表之间共享,则需要一个基表指示符和一个基表外键。

    在您的情况下,如果删除是主要问题,您可以将日志条目限制为删除,并区分级联删除与其他删除。您也可以(应该)考虑使用事务包装器来一次编写所有软删除(主要加级联)。您可以在日志中包含某种标识符,例如身份值或 GUID 作为“业务事务 ID”,并将此 ID 放入属于同一操作的每个条目中。这可以让您清楚地了解发生了什么、发生的时间、发生的原因以及发生在哪些记录上。您将能够使用此信息来决定如何撤消任何特定事务,包括执行级联恢复。

    【讨论】:

    • 主要问题是恢复。删除相当容易。但是当以反向级联方式恢复时,很难判断是否有可能在级联图可以恢复时,该图的依赖关系可能已经被删除,而要恢复的图被标记为非活动状态。跨度>
    • 有关恢复的更详细问题,请参阅此问题:stackoverflow.com/q/10111699/1026459
    • @TravisJ - 我在回答中指出,我推荐的事务日志表解决方案包括一个“业务事务 ID”,有助于澄清级联的内容。通过查找具有相同业务事务 ID 的所有更改,您可以找到在删除时完成的所有步骤。您可以颠倒这些步骤来执行还原。您可能遇到的唯一可能的问题是级联删除的项目是否还具有其他依赖项,这些依赖项可能在另一个时间在不同的业务事务 ID 下被软删除。这应该很少见。
    猜你喜欢
    • 2010-10-05
    • 2012-05-13
    • 2013-06-19
    • 2015-10-06
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多