【发布时间】:2012-04-11 05:47:22
【问题描述】:
对于实际从某些类型的表中删除行,我一直有一种奇怪的感觉。
例如,如果我有一个用户表......当他们删除他们的帐户而不是完全删除他们的行时,我一直将其标记为“死亡”或非活动状态。这让我可以在我再次需要时保留它们的存在记录。
在这种情况下 - 考虑到性能、开销等 - 我应该删除该行还是简单地标记为非活动?
哪个更“常见”?
【问题讨论】:
对于实际从某些类型的表中删除行,我一直有一种奇怪的感觉。
例如,如果我有一个用户表......当他们删除他们的帐户而不是完全删除他们的行时,我一直将其标记为“死亡”或非活动状态。这让我可以在我再次需要时保留它们的存在记录。
在这种情况下 - 考虑到性能、开销等 - 我应该删除该行还是简单地标记为非活动?
哪个更“常见”?
【问题讨论】:
也许您可以将不活动的 MySQL 记录移动到一个单独的表中,该表旨在保存不活动的帐户?这样,您可以在需要时简单地将它们移回原处,或者在数据库大小成为问题时删除表。
【讨论】:
从数据库中永久删除的数据非常有价值。标记为dead。
我通常会为此类情况提供状态。在这种模式中
0无效1活跃2 已删除【讨论】:
tinyint 就够了
就个人而言,我几乎总是使用您所描述的“软删除”。
如果担心空间问题,我会安排一份工作,在软删除记录被删除一段时间后定期清理它们。
【讨论】:
除了“软”删除之外,另一个解决方案是使用“审计表”。我最近在 dba.stackexchange.com 上问过what they were。
审计表通常用于记录对第二个表执行的操作,例如插入/更新/删除,可能存储新旧值、时间等。
它们可以使用触发器以直接的方式实现。
优点:
缺点:
【讨论】:
这个问题让我想起了这个有趣的anecdote。我的观点:在硬删除和软删除之间进行选择时要考虑的因素太多了,没有经验法则告诉您选择哪一个。
【讨论】: