django - 撤消密集数据库中的级联删除

标签 django postgresql cascading-deletes django-reversion

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

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

那么,这个问题有没有标准的解决方案呢?或者自定义 Django 版本以适合我的用例的方法?

最佳答案

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

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

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

关于django - 撤消密集数据库中的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37528428/

相关文章:

python - Django ORM将当前公司注释给用户查询集

postgresql - 是否出现在 group by 子句中或用于聚合函数中?

sql - 将历史表转换为使用范围日期(从和到日期)而不是快照日期

Hibernate 级联删除孤儿

python - 如何让 Django 的 Markdown 过滤器将回车转换为 <br/>?

javascript - AngularJS 花括号没有解析,但 ng-bind 有效

django - 在 django-crispy-forms 中显示多行和多列

Postgresql BDR 复制问题

mysql - 如何在多对一关系上使用 DELETE ON CASCADE

mysql - 查询出了什么问题?