一般来说,对于数据库,您很少删除任何内容。您可以将其标记为已删除,但一般来说,您至少会在数据库中保留一段时间。
这件事情是由很多原因导致的。其中一些是合法的。您可能需要在给定期间保留数据。其中一些是技术性的。有时它只是一种保障。您可能需要恢复信息。用户可能会要求重新打开他们的帐户,或者它可能由于垃圾邮件而被锁定,但那是因为该帐户已被盗用并且现在已经恢复。
旧数据可能会被删除或存档,但这可能需要几个月甚至几年的时间。
就我个人而言,我只是给相关数据一个状态列(例如 1 = 活动,0 = 已删除),然后在 99% 的时间里只更改状态而不是删除它。
数据完整性是这里的另一个问题。让我给你举个例子。
假设您有两个实体:
User: id, nick, name, email
Message: id, sender_id, receiver_id, subject, body
您要删除特定用户。您如何处理他们发送和接收的消息?这些消息将出现在其他人的收件箱或已发送的项目中,因此您无法删除它们。您是否将 Message 中的相关字段设置为 NULL?这也没有多大意义,因为该消息确实来自(或去往)某人,即使他们不再活跃。
您最好将该用户标记为已删除并保留它们。它使这种情况和类似情况更容易处理。
您还提到了论坛主题等。您也不能删除它们(除非有其他原因,例如垃圾邮件或滥用),因为它们是与其他内容相关的内容(例如已回复的论坛消息)。
您可以安全合理地删除的唯一数据是子数据。这确实是聚合和组合之间的区别。上面的用户和消息关系是聚合。组合的一个例子是房子和房间。你删除一个房子,所有的房间都去。没有房子,房间就不能存在。这是组合,或者,在实体关系术语中,是父子关系。
但是你会发现聚合的实例比组合的多(根据我的经验),所以问题就变成了:你如何处理这些数据?不删除不应该删除的东西,真的很难抹去某人的所有痕迹。只需将它们标记为已删除、锁定或非活动状态并以这种方式处理即可。