InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

别删除数据

作者 Abel Avram 译者 郭晓刚 发布于 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

译者 郭晓刚 是InfoQ中文站架构社区编辑,创建并终结过数家软件小企业,翻译过多本技术书籍。

听来在理 发表人 李 新 发表于
实际情况也是这样的 发表人 Kuang Kurax 发表于
Re: 实际情况也是这样的 发表人 Dong Yang 发表于
Re: 实际情况也是这样的 发表人 刘 森 发表于
Re: 实际情况也是这样的 发表人 李 铮 发表于
Re: 实际情况也是这样的 发表人 instein N 发表于
Re: 实际情况也是这样的 发表人 zhang rocky 发表于
不是所有的数据都不能硬删除 发表人 张 核铭 发表于
这个想法很正确 发表人 陈 实 发表于
关注领域模型 发表人 Han Zheng 发表于
以后要增加个VirtualDelete方法了 发表人 江天 皓月 发表于
有道理 发表人 Cheng Fu 发表于
  1. 返回顶部

    听来在理

    发表人 李 新

    看了这片文章,突然觉得自己离现实生活太远了。

    技术搞多了,意识形态都会受影响。

    这样下去,以后可如何正确理解客户、理解需求啊。

  2. 返回顶部

    实际情况也是这样的

    发表人 Kuang Kurax

    企业应用里面,没有设计会乱删除数据的……一般都是设计一个“已作废”状态

  3. 返回顶部

    Re: 实际情况也是这样的

    发表人 Dong Yang

    楼上没有好好看文章。“已作废”跟 isDeleted 是一个意思。作者的意思是不要笼统地说,这条数据被删除了或者无效了。而是要给出具体、合适的说法,不会出现删除(或者说作废)所带来的级联。

  4. 返回顶部

    Re: 实际情况也是这样的

    发表人 刘 森

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

    ============>
    说“作废”怎就不可以,它也是一种状态啊

  5. 返回顶部

    Re: 实际情况也是这样的

    发表人 李 铮

    逻辑删除和物理删除 要看需求而定 有些数据留着完全没用 还会因为表的数据量不断增加影响查询速度 当然要物理删除了

  6. 返回顶部

    不是所有的数据都不能硬删除

    发表人 张 核铭

    垃圾数据和临时数据可以删除
    当然如果考虑到性能问题,可以“移动”数据

  7. 返回顶部

    这个想法很正确

    发表人 陈 实

    这个想法很正确,现实确实是这个样子的

  8. 返回顶部

    关注领域模型

    发表人 Han Zheng

    不论是删除数据列还是isDelete或者是各种状态的设置,都应该以领域模型为依据,以业务为依据。

  9. 返回顶部

    以后要增加个VirtualDelete方法了

    发表人 江天 皓月

    要让虚拟世界与现实世界接轨。以后要增加个VirtualDelete方法了。

  10. 返回顶部

    有道理

    发表人 Cheng Fu

    通常我们都会用所谓的CRUD来表示对业务逻辑,而CRUD其实是针对数据存储来说的。对于业务逻辑,应该用更符合问题域的概念和词汇。就如同这里的delete操作与注销、辞职这些的业务概念的差别。

  11. 返回顶部

    Re: 实际情况也是这样的

    发表人 instein N

    解释的很好,赞

  12. 返回顶部

    Re: 实际情况也是这样的

    发表人 zhang rocky

    "Dahan建议用一个代表相关数据状态的字段:有效、停用、取消、弃置等等"这个与直接用isDeleted有什么区别吗,我想是没有区别的,有效、停用、取消、弃置等等是我们的程序或业务看到这个isDelete时的解读或理解。

深度内容

解析JDK 7的动态类型语言支持

随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备。在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义。

Java Remoting远程服务(下)

随着互联网应用的发展,Java分布式远程服务技术受到越来越多的关注,本文将对各种相关实现以示例的形式逐一介绍,并总结其中的优缺点,使读者能够在技术选型时有所准备。这是文章的下篇。

深入浅出Node.js(四):Node.js的事件机制

专栏的第四篇文章《Node.js的事件机制》。之前介绍了Node.js的模块机制,本文将深入Node.js的事件部分。

采访和书评:精通HTML5和CSS3设计模式

《精通HTML5和CSS3设计模式》一书记录了目前HTML5应用程序的许多常见设计模式。InfoQ对该书作者之一Dionysios Synodinos进行了采访,谈到了该书以及HTML5应用的相关内容。

构建生态化分布式数据库架构体系

本次将与大家分享B2B在构建生态化分布式数据库架构体系的摸索和实践,介绍B2B为解决海量数据实时访问,数据按需流转等业务场景开发的一系列技术产品,以及各个技术产品之间如何进行协调一致。这些产品将在不久的将来会出现在B2B的开源站点,希望给大家带来一些帮助。
本次演讲视频录制于QCon杭州2011

陶钧谈淘宝客户端应用框架实践

淘宝无线Android客户端架构设计思路汲取了移动平台上大型跨平台应用开发的经验,同时借鉴于大型网站的web开发框架思路。且看淘宝客户端如何通过 Component Model, Web Plus来面对挑战。

成功进行微软Silverlight应用程序负载测试的三项建议

虽然使用Silverlight开发扩展应用程序很吸引人,但它同时给企业带来了新的挑战。为了做好准备,企业必须调整他们的测试方法。考虑到把新技术应用在因特网或内部网应用程序中的运行方式,我们有必要小心谨慎地进行测试。

SAE云计算平台的技术发展与挑战

本演讲将详介绍SAE如何改进Zend、Apache、Memcache、MySQL等核心组件来实现隔离性并提高性能,并介绍SAE为满足高性能可持久化存储需求而自行研发的NoSQL存储KVDB服务和Rank实时排行榜服务的实现细节。
本次演讲视频录制于QCon杭州2011