别删除数据

2009 年 9 月 10 日

Oren Eini(又名 Ayende Rahien)建议开发者尽量避免数据库的软删除操作,读者可能因此认为硬删除是合理的选择。作为对 Ayende 文章的回应,Udi Dahan 强烈建议完全避免数据删除

所谓软删除主张在表中增加一个 IsDeleted 列以保持数据完整。如果某一行设置了 IsDeleted 标志列,那么这一行就被认为是已删除的。Ayende 觉得这种方法“简单、容易理解、容易实现、容易沟通”,但“往往是错的”。问题在于:

删除一行或一个实体几乎总不是简单的事件。它不仅影响模型中的数据,还会影响模型的外观。所以我们才要有外键去确保不会出现“订单行”没有对应的父“订单”的情况。而这个例子只能算是最简单的情况。……

当采用软删除的时候,不管我们是否情愿,都很容易出现数据受损,比如谁都不在意的一个小调整,就可能使“客户”的“最新订单”指向一条已经软删除的订单。

如果开发者接到的要求就是从数据库中删除数据,要是不建议用软删除,那就只能硬删除了。为了保证数据一致性,开发者除了删除直接有关的数据行,还应该级联地删除相关数据。可 Udi Dahan 提醒读者注意,真实的世界并不是级联的:

假设市场部决定从商品目录中删除一样商品,那是不是说所有包含了该商品的旧订单都要一并消失?再级联下去,这些订单对应的所有发票是不是也该删除?这么一步步删下去,我们公司的损益报表是不是应该重做了?

没天理了。

问题似乎出在对“删除”这词的解读上。Dahan 给出了这样的例子:

我说的“删除”其实是指这产品“停售”了。我们以后不再卖这种产品,清掉库存以后不再进货。以后顾客搜索商品或者翻阅目录的时候不会再看见这种商品,但管仓库的人暂时还得继续管理它们。“删除”是个贪方便的说法。

他接着举了一些站在用户角度的正确解读:

订单不是被删除的,是被“取消”的。订单取消得太晚,还会产生花费。

员工不是被删除的,是被“解雇”的(也可能是退休了)。还有相应的补偿金要处理。

职位不是被删除的,是被“填补”的(或者招聘申请被撤回)。

在上面这些例子中,我们的着眼点应该放在用户希望完成的任务上,而非发生在某个实体身上的技术动作。几乎在所有的情况下,需要考虑的实体总不止一个。

为了代替 IsDeleted 标志,Dahan 建议用一个代表相关数据状态的字段:有效、停用、取消、弃置等等。用户可以借助这样一个状态字段回顾过去的数据,作为决策的依据。

删除数据除了破坏数据一致性,还有其它负面的后果。Dahan 建议把所有数据都留在数据库里:“别删除。就是别删除。”

查看英文原文: Deleting Data Is Not a Recommended Practice

2009 年 9 月 10 日 15:475577
用户头像

发布了 225 篇内容, 共 46.4 次阅读, 收获喜欢 23 次。

关注

评论

发布
暂无评论
发现更多内容

没弄懂这些Java基础,简历上千万别写熟悉:异常+反射+注解+泛型

小Q

Java 学习 编程 面试 基础

手把手教你免费获取正版 Jetbrains 全家桶 License

郭旭东

ide JetBrains

SpringBoot魔法堂:应用热部署实践与原理浅析

云流

设计原则 框架 spring Boot Starter

阿里三面惨遭被虐,spring,jvm,mybatis,并发编程等一窍不通

Java架构之路

Java 程序员 架构 面试 编程语言

探营苏州数字人民币试点

CECBC区块链专委会

数字人民币

期权代持的“坑”里,加拿大人也在 | 法庭上的CTO(11)

赵新龙

CTO 法庭上的CTO

第三代人工智能基础设施背后,是一次技术应用的常识普及运动

脑极体

LeetCode题解:429. N叉树的层序遍历,BFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

架构之书:雄伟与《Domain Driven Design》

lidaobing

架构 领域驱动设计

架构师训练营 Week8 - 课后作业

极客大学架构师训练营

从零开始学习Java8 Stream,看这篇就够了

Silently9527

Java stream java8

有了Git这个功能,再也不需要依赖IDE了!

云流

编程 架构

互联网新规鼓励保险与大数据、区块链等新技术融合!业内呼吁配套产品管理制度尽快出炉

CECBC区块链专委会

互联网金融

架构作业--大数据

Nick~毓

Java并发编程:多线程如何实现阻塞与唤醒

码农架构

Java并发

Spring Boot 集成 Redis

噜噜猫

Spring Boot

【小菜学网络】数据链路层概述

fasionchan

网络编程 计算机网络 网络协议 TCP/IP

BAT等大厂面试复习资料文档整理:ActiveMQ+redis+Spring+高并发多线程+JVM

Java架构之路

Java 程序员 架构 面试 编程语言

赶紧看!阿里架构师必备“绝杀版”Tomact架构笔记堪称绝技

比伯

Java tomcat 编程 架构 程序人生

C语言服务器编程必备常识

MySQL从删库到跑路

c

1428万的Adobe采购纠纷 | 法庭上的CTO(10)

赵新龙

CTO 法庭上的CTO

数据类型第2篇「字典和集合的原理和应用」

清菡

测试开发

盘点 2020 | 坚持写技术博客一年能有多少收获!

小傅哥

Java 小傅哥 技术人 盘点2020

即构SDK12月迭代:新增多项质量回调,互动白板、云录制SDK同步更新

ZEGO即构

SSO的通用标准OpenID Connect

程序那些事

OAuth 2.0 程序那些事 授权框架 安全框架 openid

甲方日常 68

句子

工作 随笔杂谈 日常

生产环境全链路压测建设历程之十 淘宝网2013年的建设过程

数列科技杨德华

如何在软件发布计划中自动化语义化版本与变更日志

华为云开发者社区

自动化 工具 发布

BATJ面试常被问到的100+题:Spring+微服务+SpringMVC+MyBatis

Java架构之路

Java 程序员 架构 面试 编程语言

JVM从概述到调优图文详解,含思维脑图深度剖析!

Java架构师迁哥

旷工三天被开除,公司赔偿十万五 | 法庭上的CTO(9)

赵新龙

CTO 法庭上的CTO

别删除数据-InfoQ