V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cjyang1128
V2EX  ›  问与答

关于在数据库中删除记录的小疑问

  •  
  •   cjyang1128 · 2015-07-13 16:17:33 +08:00 · 2226 次点击
    这是一个创建于 3423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果要删除表中的一条数据,那么是添加deleted的字段表示是否删除好,还是直接删除该条记录好。两种方法都有怎样的优缺点。谢谢各位大神指点!

    20 条回复    2015-07-14 09:55:54 +08:00
    maemual
        1
    maemual  
       2015-07-13 16:19:52 +08:00
    通常情况都是使用字段标记进行假删除。
    wingoo
        2
    wingoo  
       2015-07-13 16:21:38 +08:00
    标记字段
    cjyang1128
        3
    cjyang1128  
    OP
       2015-07-13 17:05:43 +08:00
    @maemual
    @wingoo 那么会不会导致整张表变得很大,比如是新增操作发生的很平常的表
    line
        4
    line  
       2015-07-13 17:25:11 +08:00
    @cjyang1128 定期转移。
    mahone3297
        5
    mahone3297  
       2015-07-13 18:11:17 +08:00
    其实,直接delete也好的。
    只是,现在,大家都喜欢留案底,都喜欢收集数据。。。所以,就多了这么一个事情。。。增加了复杂性,个人觉得。
    hging
        6
    hging  
       2015-07-13 18:13:20 +08:00
    看你要怎么样的需求了, 没需求谈功能都是扯淡.
    比如用户-文章 这个简单的模型,
    删除文章可以直接删除, 不用标记delete
    用户的话删除建议就标记, 因为可能用户发表的有文章什么的. 删除了关联处理起来非常麻烦.
    wingoo
        7
    wingoo  
       2015-07-13 18:58:31 +08:00
    @cjyang1128 看你需求吧, 如果实在没有回溯的需要, 那也可以删除
    另外, 很多业务相关的表会有个日志表, 所有操作都会在日志中记录, 那原记录也是可以删除的
    redsonic
        8
    redsonic  
       2015-07-13 19:08:30 +08:00
    请教一下,两者在重负载下删除性能差别有多大?
    idblife
        9
    idblife  
       2015-07-13 19:13:39 +08:00
    字段标记,否则,嘿嘿
    不是所谓留案底的事情,是性能
    herozzm
        10
    herozzm  
       2015-07-13 20:26:17 +08:00 via Android
    @idblife 能解释下吗?
    redsonic
        11
    redsonic  
       2015-07-13 20:27:19 +08:00
    @idblife 有确认过性能差别吗?
    yangqi
        12
    yangqi  
       2015-07-13 20:29:49 +08:00
    直接删除过多还有一个就是会导致表的碎片过多,索引不够优化,会影响性能。所以软删除加定期转移还是比较好的,不过具体还要看业务了
    wy315700
        13
    wy315700  
       2015-07-13 20:30:50 +08:00
    @mahone3297
    比如订单,删除以后还可以恢复。这个时候就必须这么做
    mahone3297
        14
    mahone3297  
       2015-07-13 21:43:07 +08:00
    @wy315700 删除后为什么还要恢复呢?
    wy315700
        15
    wy315700  
       2015-07-13 21:45:55 +08:00
    @mahone3297
    以前,08年左右,没有网银,上京东买东西都是汇款的,然后,汇款有时候要三天。
    但是京东当时一个订单2天没有支付就删除了。
    然后收到汇款以后订单会被恢复。
    idblife
        16
    idblife  
       2015-07-13 22:38:57 +08:00
    @herozzm
    @redsonic
    update和delete的性能差别,批量物理删除是可控的
    交给应用程序就有可能出问题
    mouhong
        17
    mouhong  
       2015-07-13 22:59:57 +08:00
    个人感觉这个问题分两个层面来看:

    1. 业务层

    你的记录真的需要删除操作吗?有的时候,删除操作只是数据驱动的开发模式里的一个惯性思维。尝试更多地从业务角度进行建模。详情见: http://www.udidahan.com/2009/09/01/dont-delete-just-dont/

    2. 数据层

    数据层仅管理数据,算是 Infrastructure 的一部分,所以可能会需要有软删除之类的支持
    redsonic
        18
    redsonic  
       2015-07-13 23:47:33 +08:00
    我可能理解错了,以为有什么数据库内置有标记删除的动作。
    现在我觉得具体要看业务了,和性能没有关系,要考虑性能也不应该动这方面的脑筋。
    WildCat
        19
    WildCat  
       2015-07-13 23:49:47 +08:00 via iPhone
    Soft delete,很多 ORM 的扩展都支持,delete 的字段需要加个索引
    mahone3297
        20
    mahone3297  
       2015-07-14 09:55:54 +08:00
    @wy315700 这个是业务的设计的问题,我认为跟删除没什么关系。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3758 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:41 · PVG 18:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.