cjyang1128
V2EX  ›  问与答

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

  •  
  •   cjyang1128 · Jul 13, 2015 · 2710 views
    This topic created in 3985 days ago, the information mentioned may be changed or developed.

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

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

    1. 业务层

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

    2. 数据层

    数据层仅管理数据,算是 Infrastructure 的一部分,所以可能会需要有软删除之类的支持
    redsonic
        18
    redsonic  
       Jul 13, 2015
    我可能理解错了,以为有什么数据库内置有标记删除的动作。
    现在我觉得具体要看业务了,和性能没有关系,要考虑性能也不应该动这方面的脑筋。
    WildCat
        19
    WildCat  
       Jul 13, 2015 via iPhone
    Soft delete,很多 ORM 的扩展都支持,delete 的字段需要加个索引
    mahone3297
        20
    mahone3297  
       Jul 14, 2015
    @wy315700 这个是业务的设计的问题,我认为跟删除没什么关系。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2633 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 15:46 · PVG 23:46 · LAX 08:46 · JFK 11:46
    ♥ Do have faith in what you're doing.