sql - 如何处理数据库中的 DELETE(将已删除的实体移动到存档表)?

标签 sql database

我们目前正在开发的信息系统有一个 PostgreSQL 驱动的数据库。由于删除问题是我一直不愿意完全解决的问题,它开始困扰我,因为项目已经开始,数据库正在慢慢填满,用户实际上会想要删除不相关的数据.

在我们的案例中,将被用户删除的是我们为客户所做的某种“工作”。作业完成后,用户通常不希望将其列在网页上,因此他们会将其删除。起初(当系统处于测试阶段,所以不会造成任何伤害),用户的删除是从数据库中真正删除。因为它被很好地设置为级联到我们实体图的最底部,所以它确实删除了所有内容。而且还花了不少时间。现在我们开始真正使用这个系统,我害怕误删,我让用户无法删除任何东西。

我认为最重要的问题是“在我们的业务领域中‘删除’工作到底意味着什么?”在我们的例子中,有两点:

  • 用户不想再看到列出的工作(除非他们明确要求提供旧工作列表,因此我必须保留该列表)
  • 部分工作数据已永久消失,仅保留工作状态的一些基本概览

我读过很多关于为什么软删除是好的以及为什么它不好的文章(例如 here )。在我看来,更好的选择是将已删除的作业移至某个存档表。同时,我会删除不再需要的作业数据。这样做的好处是,我不必调整所有查询来处理某种“DeletedOn”列,并且主作业表不会被不活动的作业弄得乱七八糟。

我遇到的问题更多是技术问题:假设我仍然需要保留其他实体对已删除作业的一些引用,那么最好的方法是什么?因为我在其他实体中设置了作业表的外键,所以我不能将作业移动到另一个表,DB 不允许我这样做。

什么是常用且经过充分测试的方法?

最佳答案

如果我对你的理解正确,那么你在数据库中有某种“工作”并且不能删除所有相关信息但需要保留其中的一部分......

在这种情况下,我会使用两个选项:

  • 添加工作状态字段
    这个字段可以有不同的值,比如新的/进行中的/等待中的/已交付的/删除的……一旦你改变你的代码以适应这个新字段,你就有很大的灵 active ……你可以提供基于工作状态的过滤器UI 中的用户等。

  • 添加一个 DeleteOn 字段并隐藏它
    您重命名表,添加字段并创建一个与原始表同名的 View ,该 View 过滤掉所有设置了 DeleteOn 的记录... View 获得一个触发器(删除时),它仅为相应的作业设置该字段。 .. 没有级联删除,没有困惑/更改代码等。如果需要,您始终可以扩展触发器以移动所有或部分将 DeleteOn 设置为存档表的行...

关于sql - 如何处理数据库中的 DELETE(将已删除的实体移动到存档表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289794/

相关文章:

sql - Access SQL : like function on a number field

sql-server - 将来自不同数据库的数据整理到同一个输出窗口

sql - MS access 2016 中 OUTER APPLY 的等效命令

java - jsp注册页面

python - 每次测试后如何重置 Django 测试数据库 ID?

php - 是否可能返回类似 Excel 的查询?

mysql - 删除 MySQL 中字段具有重复数字的行

sql - 我怎样才能避免额外的内部连接来优化这个查询?

c# - 程序启动时如何启动mysql数据库?

sql - 使用 linq 检查列表中的所有项目是否出现在另一个列表中