Java 删除实体策略 为了保持系统的一致性,可以考虑2种删除策略:
级联删除关系中的所有实体Java 删除实体策略 为了保持系统的一致性,可以考虑2种删除策略:,java,entity,Java,Entity,级联删除关系中的所有实体 模拟删除(即,实际上没有从数据库中删除任何内容,但是,例如,实体中的字段deleted具有值true,并且它会影响显示逻辑) 我喜欢第二种方法,但我不知道如何正确地实施它 例如,假设我们开发了一个简单的博客(用户、文章、评论和其他常见的东西)。让我们看看User实体(以及相应的表User)。如果我们删除某个用户,那么他的deleted字段将具有值true。所有用户的评论都会留在原处,每个读者都会知道某个评论的作者是谁 所有这些看起来都很棒,但是如果一个新用户(正在尝试注
deleted
具有值true
,并且它会影响显示逻辑)User
实体(以及相应的表User
)。如果我们删除某个用户,那么他的deleted
字段将具有值true
。所有用户的评论都会留在原处,每个读者都会知道某个评论的作者是谁
所有这些看起来都很棒,但是如果一个新用户(正在尝试注册)将指定与某个已删除用户相同的登录/电子邮件地址(其他唯一字段),我该怎么办?理论上,这个唯一的字段值已经是免费的,可以使用。但是,如果有一天我决定取消删除那个被删除的用户呢
与这种情况相关的最佳实践是什么 这实际上取决于您所使用的系统的特定需求和要求 通常,在示例的第一部分这样的情况下需要“软删除”功能,即即使用户被“删除”,您也不希望将其内容从系统中删除。但是,在这种情况下,您将面临一个失败,即用户帐户将永远使用,并且您将无法在将来为其他任何人重复使用该帐户 在其他情况下,首选“级联删除”选项,但它可能会成为一个非常有趣的管理工具,因为对于许多级联约束,单个删除可能会影响比预期多得多的表
我认为理解你想要实现的目标很重要,因为这里的两种解决方案实际上都是有效的。具体的业务案例决定了哪个最适合于特定的实现。听起来您最好的选择是软删除(在用户表中放置一个标志)。如果您想重新激活一个用户,您可能会遇到以下问题 用户A做了很多事情
用户A进入休眠状态
用户B使用相同的用户ID创建帐户。
用户A想要返回
您可能想做的是将站点上的所有内容引用到唯一的用户ID,并且从不删除用户。我们会软删除所有内容,并每晚将其存档,然后在一个月后硬删除生产数据库中的所有软删除内容。可能考虑从存档中删除超过六个月的软删除。这取决于你的需要和什么对他们有意义。