V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
korvin
V2EX  ›  程序员

数据库标记软删除( Soft Delete)数据时,是用 Boolean 好还是有 DateTime 好?

  •  
  •   korvin · 2016-06-15 10:36:38 +08:00 · 5391 次点击
    这是一个创建于 3068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人感觉用Boolean性能上应该会好点,DateTime还要获取当前时间,但用DateTime即可以记录删除状态,也可以记录删除的时间。

    大家一般用哪个?

    23 条回复    2016-06-15 21:03:00 +08:00
    zonghua
        1
    zonghua  
       2016-06-15 10:39:12 +08:00
    我也想问,如果用其他 ORM 框架的话怎么方便地去实现
    kenshinhu
        2
    kenshinhu  
       2016-06-15 10:42:18 +08:00
    Boolean + UpdateTime 方式应该会更新
    kenshinhu
        3
    kenshinhu  
       2016-06-15 10:42:34 +08:00
    打错字,是 Boolean + UpdateTime 方式应该会更好
    robertlyc
        4
    robertlyc  
       2016-06-15 10:42:46 +08:00
    可以参考 paranoia 建议用 datatime
    loading
        5
    loading  
       2016-06-15 10:48:56 +08:00 via Android
    都考虑到获取时间的开销了…请问贵公司是哪家?
    Numbcoder
        6
    Numbcoder  
       2016-06-15 10:50:35 +08:00
    deleted_at
    solaya
        7
    solaya  
       2016-06-15 11:00:31 +08:00
    参考 eloquent
    zsx
        8
    zsx  
       2016-06-15 11:01:51 +08:00
    Laravel Eloquent softDelete 是 deleted_at
    learnshare
        9
    learnshare  
       2016-06-15 11:03:29 +08:00
    Boolean 记录数据状态, Time 记录操作时间,可以共存。
    可以扩展一整套操作记录日志的数据出来,记录所有操作(谁,什么时间,干了啥)。
    korvin
        10
    korvin  
    OP
       2016-06-15 11:14:01 +08:00
    @loading 我只是陈述做法的利弊。
    korvin
        11
    korvin  
    OP
       2016-06-15 11:14:17 +08:00
    @kenshinhu 为什么呢,能说下原因吗?
    loading
        12
    loading  
       2016-06-15 11:19:55 +08:00 via Android
    @korvin boolean 查起来会快些,但是有了 dt 以后数据价值更高。

    如果很在意性能,两个,每到很高要求, dt
    hwsdien
        13
    hwsdien  
       2016-06-15 13:29:50 +08:00
    deleted_at
    greenmoon55
        14
    greenmoon55  
       2016-06-15 13:35:38 +08:00
    这点开销无所谓吧,可以两个都记
    CrowQu
        15
    CrowQu  
       2016-06-15 13:35:48 +08:00
    用 boolean ,除去性能上的考虑以外,代码逻辑、维护成本会很低。数据库中尽量少用一个字断代表多个含义。
    kenshinhu
        16
    kenshinhu  
       2016-06-15 13:37:31 +08:00
    @korvin updateTime 是用来保存 该记录的修改时间(save 触发), 使用 Boolean 来作为 删除的软标记,那就可以知道删除时间或 save 触发的上一次时间点
    mko0okmko0
        17
    mko0okmko0  
       2016-06-15 14:34:34 +08:00
    我个人是 long 栏位,放的是 UTC/GMT 时间转整数,全球一致大好.
    注解栏写上负值意义,例如预设-1 就是未删除,-2=xx,-3=yy...正值就是有删除而且有时间精确到毫秒.
    缺点是要查"每周三谁删除了什么"这种时间范围查找比较难搞,有这种需求就用时间日期栏位.注解预设时区.
    然后独立出状态栏位,文字栏或是数字状态栏位都可.

    updateTime 这栏会因为任何变更导致更新此栏,避免问题所以不优先考虑.
    bool 栏位假如有天要换资料库就难搞,不是每个资料库都有,
    用整数栏位性能相等,状态值更多选择.

    "如果可以"一栏描述完成,我"尽量不用"更多栏位.长长的栏位光是建模或是描述就很头痛.
    aiguow
        18
    aiguow  
       2016-06-15 14:36:24 +08:00
    删除时间应该用另一个表存(记录操作日志的表)
    hantsy
        19
    hantsy  
       2016-06-15 14:38:56 +08:00
    @korvin 实际上这只是 Audit 的一部分,所有重要的修改( Create , Update , Delete )都应该是可查的。。。 Hibernate Envers 可以管理这些操作。

    但之前的项目采用一些自定义的方案。
    1. 标志 Delete 。。。 deleted(boolean), deleted_at(Date), deleted_by(User)
    2. 生成 Event LOG 记录。
    3. 所有标志为 Deleted 的记录对普通用户不可见,对 Admin 可见,用 Hibernate @Filter 可实现。
    4. 操作以事件方式,可能通知其它变化,比如从 ElasticSearch 中删除对应的 Index 。
    cloverstd
        20
    cloverstd  
       2016-06-15 14:42:25 +08:00
    我想知道如果用软删除,是在删除的时候把所有的关联都标记为删除
    还是只是标注删除的那一行,然后查询的时候,用 join 去查询呢
    korvin
        21
    korvin  
    OP
       2016-06-15 14:57:54 +08:00
    @cloverstd 这个我觉得应该要看实际需求吧。
    nandaye
        22
    nandaye  
       2016-06-15 16:14:59 +08:00
    数据仓库会用 “标记+时间”
    realpg
        23
    realpg  
       2016-06-15 21:03:00 +08:00
    一般软删除我都是直接移动记录到 deleted 表
    只有少数情况管理后台才需要去查询 deleted ,大多数正常访问额外加上 deleted 不是的判断都会严重降低效率
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   948 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:48 · PVG 04:48 · LAX 12:48 · JFK 15:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.