数据库标记软删除( Soft Delete)数据时,是用 Boolean 好还是有 DateTime 好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
korvin
V2EX    程序员

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

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

    个人感觉用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  
    PRO
       2016-06-15 21:03:00 +08:00
    一般软删除我都是直接移动记录到 deleted 表
    只有少数情况管理后台才需要去查询 deleted ,大多数正常访问额外加上 deleted 不是的判断都会严重降低效率
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5768 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 02:04 PVG 10:04 LAX 18:04 JFK 21:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86