您的当前位置:首页 > 知识博客 > 建站经验

为什么MySQL不建议使用delete删除数据?

时间:2024-06-03

Udi Dahan——著名的软件架构师和分布式系统与面向服务架构(SOA)领域的专家,创立了著名的开源消息框架NServiceBus, 在其个人网站发表了一篇文章《完全避免删除数据》作为回应:

Oren Ein,别名Ayende Rahien,鼓励开发人员避免使用数据库软删除,给读者留下硬删除是一种选择的印象。对Ayende的博文做出回应,Udi Dahan 强烈建议完全避免数据删除。
支持软删除操作的倡导者建议在表中添加一个IsDeleted列
,保留数据的完整性。如果设置了IsDeleted标志,该行将被视为已删除。Ayende认为这种方法“简单、易于理解、快速实施和解释”,但“很多时候是错误的”。问题在于:
删除一行或一个实体很少是一个简单的事件。它不仅影响模型中的数据,还影响模型的结构。这就是为什么我们有外键,以确保我们不会出现没有父级订单的订单行的情况。而这只是最简单的问题之一。...

当我们处理软删除时,很容易陷入这种情况:因为客户的LastOrder(这只是一个没有人考虑到的微小优化)现在指向一个被软删除的订单,导致数据在实质上损坏。
如果要求开发人员从数据库中删除数据,并且不建议使用软删除,那么他只能选择硬删除。为了保持数据的完整性,他应该级联删除行和所有相关数据。Udi Dahan 提醒我们,现实世界并不会自动级联删除
假设我们的营销部门决定从目录中删除一个项目。那么包含该项目的所有先前订单都应该消失吗?并且继续级联删除,所有这些订单的发票也应该被删除吗?接下来,我们是否需要重新制作公司的损益报表

天哪,千万不要这样做。”
问题似乎出在对于"删除"这个词的解释上。Udi Dahan 举了以下例子:
我所说的“删除”的意思是该产品应该停产。我们不再想销售这个产品系列。我们想要处理我们现有的库存,但不再向供应商订购更多产品。当客户进行产品搜索或分类列表时,该产品不应再出现,但仓库的员工在过渡期仍需要管理这些物品。不过,简单地说“删除”更加简洁。

他继续通过给出用户意图的正确解释来阐述:
订单并不是被删除,而是被取消。如果订单取消得太晚,还可能会产生费用。
员工并不是被删除,而是被解雇(或者可能是退休)。通常需要处理一份补偿方案。
职位并不是被删除,而是被填补(或者其职位需求被撤销)。
在所有情况下,我们应该关注用户希望执行的任务,而不是针对一个实体或另一个实体执行的技术动作。几乎在所有情况下,需要考虑多个实体。”
Udi Dahan建议不使用IsDeleted标志,而是使用一个包含相关数据状态的字段:活动的、停产的、已取消的、已废弃的等等。这样的状态字段允许用户查看过去的数据并基于其做出决策。
除了破坏数据完整性之外,删除数据可能会产生负面后果。Udi Dahan的建议是将所有数据保留在数据库中:“不要删除。就是这样。”


欢迎咨询/Welcome to inquire
tel/vx:18842938855
qq:1685522781
email:1685522781@qq.com

Copyright © 2019-2024 mysql.hk


Whatsapp