Spring开机ERP系统最佳删除操作策略

Spring Boot ERP system best delete operation strategy

我正在为中小型组织开发一个 ERP 系统,当涉及到实体的删除操作时,我卡住了。 现在我有一个项目实体和一个任务实体,即一个项目有很多任务
现在执行删除操作时我有三个选项。

1> 要么从数据库中永久删除数据,包括子数据
即如果项目被删除,那么也删除它的关联任务

这里的问题是:一旦删除,我们将无法恢复。

2> 要么只将 isDeleted 设置为 true。

这里的问题是:如果任何实体的 isDeleted 为真,那么它的关联实体可以通过 Getter 方法获取它(所以这不是一个好主意)
如果项目 P1 有三个任务 T1、T2、T3,Fetch 类型为 EAGER。 例如如果我将 Task T1 as isDeleted 设置为 true 那么,如果我得到项目 P1,它还将与 T1 一起获得三个任务,因为它们之间仍然存在关系,T1 仅更新为 isDeleted 为 true。

3> 或将实体的所有事件(CRUD)存储在单独的历史表中

这里的问题是:数据库大小将是常规数据库的数倍。

评论摘要:

1> either delete data permanently from database, with child data i.e. if project is deleted then also delete it's associated tasks

here problem is : we won't be able to get back, once it is deleted.

您实际上并不想删除这些数据。您只希望 sudo 删除那些数据,还希望能够恢复已删除的数据。 解决方案:您可以将此数据标记为已删除(可能会出现问题)或单独维护 table/schema,您只在其中存储已删除的数据。 通过将其移动到单独的 table,您无需担心已删除的标志和其他复杂的父子关系。

2> either only set isDeleted to true.

3> or store all events(CRUD) of an entity in separate history tables

这两个问题也将自动解决,如果你遵循(分离删除的数据)方法。

与其实际删除数据,而且比 isDeleted 更好,试试 deletedDate。如果 deleted_date 为空,则产品处于活动状态。如果没有,将设置删除日期。

现在在实体上,写

@DynamicInsert
@SQLDelete(sql =
        "UPDATE post SET deleted_date=now() " +
                "WHERE id = ?")
@Where(clause = "deleted_date IS NULL ")
class User{
}

这里,@SQLDelete会确保当你调用删除方法时,它并没有真正删除实体,而是将它的删除日期设置为它被删除的时间。

@Where cause 将确保无论何时调用任何实体,它都会将代码 AND deleted_date IS NULL 添加到其触发的相应休眠查询中,因此只会获取未删除的实体。