场景:“发票”引用了“用户”类。用户对象是通过用户自己或管理员删除的,但发票对象仍然需要一个接收者(用户)。
用户对象可以标记为已删除,而不是物理删除。但我认为使用一个被标记为已删除的对象是一个糟糕的设计。在我看来,对象只应在删除后归档为法律要求,但不能定期使用。
从物理上移除它们会使事情变得更容易:级联删除,选择,数据库备份......
如何避免使用标记为已删除的对象?我需要什么样的设计才能从数据库中物理删除未使用的对象?有最好的做法吗?
上下文:基于Java EE和关系数据库的OOP(DDD)应用程序。
答案 0 :(得分:2)
我和我的组织中的许多不同的人一起讨论了很多次。我不认为应该删除用户帐户。如果仅用于能够轻松维护用户所做事情记录的基本情况。我建议为用户提供状态,例如active,on_hold,deactivated。然后,您需要的是根据需要停用用户帐户。当然,在“选择”用户时,您需要验证它们是否处于活动状态。如果用户回到组织,这也会更容易。
答案 1 :(得分:2)
这是您真实世界的情况,发票和用户意味着我认为他们的意思吗?
因为,我没有看到如何在现实世界中删除发票。如果错误地向客户发出发票,则可能无效,但物理数据无法删除,否则您无法保留包含发票的信息。如果发票有效但与之关联的用户被终止,您仍然需要能够看到与发票相关联的用户,否则您将丢失有关谁发出或批准发票或其他任何内容的信息。
至于避免使用被删除的对象,我不认为它适用于此,因为实际上不能删除这些对象。对于创建新发票或发票的用户来说,他们显然已经过期,无效,终止或无效状态,但他们肯定不会因为不存在或被认为不存在而被删除,因为他们自交易发生以来,显然确实存在。
答案 2 :(得分:0)
在数据库级别,您至少有两个可靠的替代方案。
1)如果存在关联的发票,则不允许删除用户。
2)删除用户后,将删除所有关联的发票。这可以通过参考完整性和级联删除最有效地完成。
我同意你的看法,简单地将发票标记为已删除是不好的做法。如果它真的被删除了,它应该来自数据库(或者可能在某处存档)。
兰迪
答案 3 :(得分:0)
不确定是否需要保留发票?
如果是,那么你有几个选择。一种是保持用户删除标志。如果您不知道原始用户是谁,那么就创建一个“已删除用户” - 用户对象。您可以将发票链接到该已删除的用户。
如果答案为否,则只删除引用已删除用户的所有对象。您可以手动或使用数据库的级联删除功能来执行此操作。
答案 4 :(得分:0)
为什么需要保留已删除的信息?通常,您需要将其保留用于审计,合规性或法律要求。
通常,能够重现数据库的早期状态就足够了。数据库将支持此功能。
对于大多数用途,重要的是
如果您真的不允许从数据库中删除它,您可以随时将其放在存档表中,或者对数据库表进行分区,以便删除的对象不会影响查询的效率。