删除 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 行,或标记“死亡”?的主要内容,如果未能解决你的问题,请参考以下文章
8-vim-移动命令-04-利用标记返回之前小编辑的代码位置