我有一个相当大的生产数据库系统,基于一个大型的节点层次结构,每个节点都有一个10+相关的模型。如果有人在树中删除一个相当高的节点,可能会有数千个模型被删除,如果删除是一个错误,恢复它们可能会非常困难。我正在寻找一种方法给我一个简单的‘撤销’选项。
我尝试过使用Django-reversion,但是为了获得我想要的功能(轻松地恢复一个大的级联删除),它需要在每个修订版中存储大量的信息。当我创建初始版本时,这个过程还不到10%,而且它已经在我的数据库中使用了8GB,这对我来说是行不通的。
那么,这个问题有一个标准的解决方案吗?或者一种定制Django的方法--还原以适合我的用例?
发布于 2016-05-30 17:07:28
你要找的是所谓的软删除。向表中添加一个名为deleted的列,其值为false。现在,当您想要执行“删除”时,请将列deleted更改为true。更新所有代码,以不显示标记为已删除的行(或移动数据库表,并将其替换为不显示它们的视图)。将所有唯一的约束更改为有一个过滤器WHERE deleted = false,这样您就不会因为不能添加类似于用户在系统中看不到的内容而出现问题。
至于级联,你有两个选择。要么执行将更新子行的ON UPDATE触发器,要么将deleted列添加到FK并将其定义为ON UPDATE CASCADE。
您将以额外的一行为代价获得整个反向功能(除非手动删除,否则无法删除内容以节省空间)。
https://stackoverflow.com/questions/37528428
复制相似问题