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

2016-06-15 10:36:38 +08:00
 korvin

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

大家一般用哪个?

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

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

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

"如果可以"一栏描述完成,我"尽量不用"更多栏位.长长的栏位光是建模或是描述就很头痛.
aiguow
2016-06-15 14:36:24 +08:00
删除时间应该用另一个表存(记录操作日志的表)
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
2016-06-15 14:42:25 +08:00
我想知道如果用软删除,是在删除的时候把所有的关联都标记为删除
还是只是标注删除的那一行,然后查询的时候,用 join 去查询呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/285837

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX