在密集数据库中撤消级联删除

时间:2016-05-30 14:44:33

标签: django postgresql cascading-deletes django-reversion

我有一个相当大的生产数据库系统,基于大型节点层次结构,每个节点都有10个以上的关联模型。如果有人删除树中相当高的节点,则可能会删除数千个模型,如果删除错误,则恢复它们可能非常困难。我正在寻找一种方法,让我轻松地“撤消”#39;选项。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

您将以一个额外的行为代价获得整个反向功能(除非您手动执行此操作,否则无法删除内容以节省空间)。