我应该删除我的MySQL记录,还是应该有一个“is_deleted”标志?

时间:2011-11-25 23:30:27

标签: mysql sql database-design

出于某种原因,有人告诉我永远不要删除任何MySQL记录。只需将其标记为已删除。

例如,我正在建立一个“跟随”社交网络,如Twitter。

+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| id          | int(11)    | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)    | NO   |     | NULL    |                |
| to_user_id  | int(11)    | NO   |     | NULL    |                |
+-------------+------------+------+-----+---------+----------------+

用户1跟随用户2 ...

因此,如果一个用户停止关注某人,我应该删除此记录吗?或者我应该为is_deleted创建一个列?

4 个答案:

答案 0 :(得分:4)

这是一个名为“软删除”的概念。谷歌为这个词找到了更多。但是使用标志标记只是一个选项 - 您也可以实际执行删除,但是具有将副本存储在历史表中的触发器。这样您就不必更新所有选择功能以专门过滤掉已删除的记录。此外,您不必在桌面上加载太多的负载,因为您必须扫描乱扔桌子的其他记录。

答案 1 :(得分:1)

概括“你永远不应该删除记录”这个更大的概念会(并且应该)将这个问题关闭为非构造性,但你已经给出了一个特定的场景:

  

用户1跟随用户2 ...

     

因此,如果一个用户停止关注某人,我应该删除此记录吗?   或者我应该为is_deleted创建一个列?

您的案例中的答案取决于在取消关注之后,您是否再次需要知道用户1是否跟随用户2.有些可能是愚蠢的例子,这可能是情况下:

  • 如果需要更改文本,用户1会在选择关注用户2时从“关注用户2”到“再次关注用户2?真的吗?你没有吸取教训吗?”
  • 如果你想向用户2显示一个图表,显示他们随着时间的推移有多少(或者总计有多少)粉丝

如果您不需要依赖于过去用户状态的功能,那么删除记录是安全的。在you ain't gonna need it时无需承担软删除的复杂性。

答案 2 :(得分:0)

我不会说,“永远不会删除任何MySQL记录”。这取决于。如果要跟踪用户交互,可以使用删除标记来完成此操作。您甚至可以创建一个单独的日志记录表,使用适当的用户ID和时间戳来跟踪“跟随”和“取消关注”等每个操作,最后为您提供更多信息。

取决于您要存储的数据,取决于您。请考虑用户的隐私。如果他们希望明确删除他们的数据,那么就这样做。

答案 3 :(得分:-1)

我一直是创建blnDeleted字段并使用它而不是删除记录的粉丝。如果将数据保留在数据库中,则更容易恢复或添加数据。

您可能认为您永远不会再需要这些数据,但这是可能的。即使对于跟踪取消订阅或类似事情这样简单的事情也是如此。