如何避免将对象标记为已删除?

时间:2010-01-05 15:23:29

标签: database database-design oop domain-driven-design

场景:“发票”引用了“用户”类。用户对象是通过用户自己或管理员删除的,但发票对象仍然需要一个接收者(用户)。

用户对象可以标记为已删除,而不是物理删除。但我认为使用一个被标记为已删除的对象是一个糟糕的设计。在我看来,对象只应在删除后归档为法律要求,但不能定期使用。

从物理上移除它们会使事情变得更容易:级联删除,选择,数据库备份......

如何避免使用标记为已删除的对象?我需要什么样的设计才能从数据库中物理删除未使用的对象?有最好的做法吗?

上下文:基于Java EE和关系数据库的OOP(DDD)应用程序。

5 个答案:

答案 0 :(得分:2)

我和我的组织中的许多不同的人一起讨论了很多次。我不认为应该删除用户帐户。如果仅用于能够轻松维护用户所做事情记录的基本情况。我建议为用户提供状态,例如active,on_hold,deactivated。然后,您需要的是根据需要停用用户帐户。当然,在“选择”用户时,您需要验证它们是否处于活动状态。如果用户回到组织,这也会更容易。

答案 1 :(得分:2)

这是您真实世界的情况,发票和用户意味着我认为他们的意思吗?

因为,我没有看到如何在现实世界中删除发票。如果错误地向客户发出发票,则可能无效,但物理数据无法删除,否则您无法保留包含发票的信息。如果发票有效但与之关联的用户被终止,您仍然需要能够看到与发票相关联的用户,否则您将丢失有关谁发出或批准发票或其他任何内容的信息。

至于避免使用被删除的对象,我不认为它适用于此,因为实际上不能删除这些对象。对于创建新发票或发票的用户来说,他们显然已经过期,无效,终止或无效状态,但他们肯定不会因为不存在或被认为不存在而被删除,因为他们自交易发生以来,显然确实存在。

答案 2 :(得分:0)

在数据库级别,您至少有两个可靠的替代方案。

1)如果存在关联的发票,则不允许删除用户。

2)删除用户后,将删除所有关联的发票。这可以通过参考完整性和级联删除最有效地完成。

我同意你的看法,简单地将发票标记为已删除是不好的做法。如果它真的被删除了,它应该来自数据库(或者可能在某处存档)。

兰迪

答案 3 :(得分:0)

不确定是否需要保留发票?

如果是,那么你有几个选择。一种是保持用户删除标志。如果您不知道原始用户是谁,那么就创建一个“已删除用户” - 用户对象。您可以将发票链接到该已删除的用户。

如果答案为否,则只删除引用已删除用户的所有对象。您可以手动或使用数据库的级联删除功能来执行此操作。

答案 4 :(得分:0)

为什么需要保留已删除的信息?通常,您需要将其保留用于审计,合规性或法律要求。

通常,能够重现数据库的早期状态就足够了。数据库将支持此功能。

对于大多数用途,重要的是

  1. 记录每个删除操作
  2. 能够追踪删除条目的时间以及由谁删除。
  3. 如果您真的不允许从数据库中删除它,您可以随时将其放在存档表中,或者对数据库表进行分区,以便删除的对象不会影响查询的效率。