cjyang1128
V2EX  ›  问与答

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

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

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

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

    1. 业务层

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

    2. 数据层

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