DELETE的最佳关系数据库方法:使用DELETE或使用有效/无效的COLUMN?

时间:2015-02-28 09:01:23

标签: mysql database-design relational-database

说到数据库,这是用户想要删除他的个人资料/删除部分时使用的最佳技术方法他的产品来自购物卡:

  1. 实际上从具有id的关系表中删除行使用DELETE

  2. 不要删除任何行,但更改布尔COLUMN / enum COLUMN 的值(让我们称之为有效/无效)从 true到false / 0到1 - 这意味着无论何时你想选择所有 现有用户/产品你需要一个 WHERE子句来过滤,只有在这个特定的COLUMN上有真实的那个。

  3. 我问这个是因为我和两位经验丰富的数据库开发人员交谈过,当我告诉他们我真的从MySQL数据库的表中删除行时,他们感到震惊!其中一个告诉我,她被教导永远不会从表中删除已插入的行。

    所以我想找到哪种方法是最好的专业方法。

1 个答案:

答案 0 :(得分:0)

也许他们没有回答技术问题,而是业务问题。如果你需要恢复profile / shoppingcart / what发生的事件的历史记录,删除行是不好的(商业上的)。

技术的角度来看,无论如何都没有强烈的争论。

将行标记为“已删除”会在表中留下混乱,并在WHERE子句中将SELECT与AND deleted=0混为一谈。如果删除表中的“大多数”,性能会受到影响。

实际上删除行丢失历史记录(如上所述),需要付出努力,并对表进行分段。努力很小。碎片化,特别是如果你使用InnoDB(你应该是),不值得担心。

第三个选项是从主表中删除它并将其插入到具有类似模式的存档表中。这是更多的工作:DELETE + INSERT在删除时,UNION当你需要看到活动行和删除行等时,可以使用PARTITION,但我认为它没有用。我说类似,因为你可能想要避免可能会让你失望的独特键(以及其他东西),例如,如果用途在他的购物车中摇摆不定,相同的行被存档两次。

以这种方式看待......银行记录非常永久;购物车非常短暂(直到购买完成);其他事情介于两者之间。根据业务原因选择实际的DELETE与标志,而不是MySQL的原因。

(我很想听听开发人员对我评论的反应。我可能会遗漏一些东西。)