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
添加到其触发的相应休眠查询中,因此只会获取未删除的实体。
我正在为中小型组织开发一个 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
添加到其触发的相应休眠查询中,因此只会获取未删除的实体。