【问题标题】:Undoing cascade deletions in a dense database撤消密集数据库中的级联删除
【发布时间】:2016-09-28 10:43:11
【问题描述】:

我有一个相当大的生产数据库系统,它基于大量的节点层次结构,每个节点都有 10 多个关联模型。如果有人删除了树中相当高的节点,可能会删除数千个模型,如果删除是错误的,那么恢复它们可能会非常困难。我正在寻找一种方法来给我一个简单的“撤消”选项。

我尝试过使用 Django-reversion,但似乎为了获得我想要的功能(轻松恢复大型级联删除),它需要在每个修订版中存储一堆信息。当我创建初始修订时,该过程完成不到 10%,并且它已经在我的数据库中使用了 8GB,这对我来说不起作用。

那么,这个问题有标准的解决方案吗?或者一种自定义 Django-reversions 以适应我的用例的方法?

【问题讨论】:

  • 我们是在谈论通过查询删除还是在网页上单击删除?也就是说,你需要恢复什么行为。
  • @JakubKania 点击网页上的删除。基本上,用户删除了一个高级节点,它级联了一堆东西,我收到一封电子邮件,上面写着“糟糕,我需要返回数据”。
  • 除了正确描述您的选项的 Jakub 的回答之外,如果您需要完全防止这种情况,您可以通过在外键上设置 on_delete 选项来取消设置 django 默认的级联行为。文档docs.djangoproject.com/en/dev/ref/models/fields/…

标签: django postgresql cascading-deletes django-reversion


【解决方案1】:

您要查找的内容称为软删除。向表中添加一个名为 deleted 且值为 false 的列。现在,当您想要执行“删除”时,请将 deleted 列更改为 true。更新所有代码以不显示标记为已删除的行(或移动数据库表并将其替换为不显示它们的视图)。将所有唯一约束更改为具有过滤器WHERE deleted = false,这样您就不会遇到无法添加类似于用户在系统中看不到的内容的问题。

至于级联,您有两种选择。要么执行 ON UPDATE 触发器来更新子行,要么将 deleted 列添加到 FK 并将其定义为 ON UPDATE CASCADE

您将获得完整的反向功能,但需要多花一行(除非您手动执行,否则无法删除内容以节省空间)。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2022-01-05
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多