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

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

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

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

哪个更“常见”?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      1. 0无效
      2. 1活跃
      3. 2 已删除

      【讨论】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        优点:

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

        缺点:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-07-13
            • 1970-01-01
            • 1970-01-01
            • 2017-09-17
            • 2018-02-22
            • 2016-06-08
            • 2019-07-27
            • 2020-10-31
            • 1970-01-01
            相关资源
            最近更新 更多