删除 MySql 行,或标记“死亡”?

Posted

技术标签:

【中文标题】删除 MySql 行,或标记“死亡”?【英文标题】:Delete MySql rows, or mark "dead"? 【发布时间】:2012-04-11 05:47:22 【问题描述】:

对于实际从某些类型的表中删除行,我一直有一种奇怪的感觉。

例如,如果我有一个用户表......当他们删除他们的帐户而不是完全删除他们的行时,我一直将其标记为“死亡”或非活动状态。这让我可以在我再次需要时保留它们的存在记录。

在这种情况下 - 考虑到性能、开销等 - 我应该删除该行还是简单地标记为非活动?

哪个更“常见”?

【问题讨论】:

【参考方案1】:

也许您可以将不活动的 mysql 记录移动到一个单独的表中,该表旨在保存不活动的帐户?这样,您可以在需要时简单地将它们移回原处,或者在数据库大小成为问题时删除表。

【讨论】:

【参考方案2】:

从数据库中永久删除的数据非常有价值。标记为dead

我通常会为此类情况提供状态。在这种模式中

    0无效 1活跃 2 已删除

【讨论】:

我喜欢基于数字的方法..节省一点开销:) @johnnietheblack,是的tinyint 就够了【参考方案3】:

就个人而言,我几乎总是使用您所描述的“软删除”。

如果担心空间问题,我会安排一份工作,在软删除记录被删除一段时间后定期清理它们。

【讨论】:

【参考方案4】:

除了“软”删除之外,另一个解决方案是使用“审计表”。我最近在 dba.stackexchange.com 上问过what they were。

审计表通常用于记录对第二个表执行的操作,例如插入/更新/删除,可能存储新旧值、时间等。

它们可以使用触发器以直接的方式实现。

优点:

“未使用”数据位于单独的表中 将细节级别旋钮从细粒度转到粗粒度很容易 它可能在空间方面更有效,具体取决于具体实现

缺点:

由于数据位于单独的表中,因此在“未删除”行的情况下可能会导致键冲突 它可能在空间方面效率较低,具体取决于具体实现

【讨论】:

【参考方案5】:

这个问题让我想起了这个有趣的anecdote。我的观点:在硬删除和软删除之间进行选择时要考虑的因素太多了,没有经验法则告诉您选择哪一个。

【讨论】:

以上是关于删除 MySql 行,或标记“死亡”?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL -- 标记除 1 个匹配行之外的所有行

MySQL学习删除表数据

8-vim-移动命令-04-利用标记返回之前小编辑的代码位置

如果在文件末尾省略PHP块的结束标记,是否会删除任何换行符或空格(如果存在于相应的文件中)?

notepad 如何选择被标记的行?

如何从 Google Maps v3 API 中删除带有 mysql 数据的标记?