数据库怎么最简单实现 “栈” 结构存储?

2018-01-20 20:00:44 +08:00
 miniyao
比如用数据库保存员工的签到记录,只要求保留最后 30 次的签到记录即可。

现在是写了个定时任务去每天晚上自动执行“删除超过 30 次的旧记录”,有没有更简单的方法,用类似入栈 /出栈的方式,在员工签到的时候就把这个“删除超过 30 次的旧记录”的操作给办了?

即:如果新员工签到记录不满 30 条,签到记录就都留着;老员工已经有最近 30 次签到记录的,每次打卡,自动把最早的那条旧记录剔除。
7141 次点击
所在节点    MySQL
55 条回复
EchoUtopia
2018-01-20 20:04:42 +08:00
这不是队列么……
miniyao
2018-01-20 20:10:23 +08:00
@EchoUtopia 活太轻,放队列里去感觉没那么大必要 :-)
callmedachang
2018-01-20 20:10:54 +08:00
这个比如怕是 实际需求吧
miniyao
2018-01-20 20:15:11 +08:00
@callmedachang 是啊,每次去定时跑一遍删那么几条数据好像杀鸡用了牛刀
monsterxx03
2018-01-20 20:16:31 +08:00
trigger
qiayue
2018-01-20 20:32:27 +08:00
每次打卡的时候查一次也可以吧,多了就删
joshz
2018-01-20 20:32:49 +08:00
打卡的时候写 SP 先删旧的再插新的,或者用 trigher
est
2018-01-20 20:35:58 +08:00
这个不是栈吧。一般是按照时间自动过期

按条数的很少见

你真要做,用原子自增然除以 30 的余数作为主键 upsert
twor
2018-01-20 20:40:33 +08:00
def save( ):
----CheckLog.objects.filter(user=self)[30:].delete()
twor
2018-01-20 20:41:52 +08:00
哦 咩有 order_by
geelaw
2018-01-20 21:02:06 +08:00
@miniyao 我觉得你没理解他的意思——这种先进先出的结构叫做队列,如果是栈,那么最先被删除的是最近的记录。

回到问题本身,你可以用循环队列的想法。
feverzsj
2018-01-20 21:09:28 +08:00
明显 event scheduler 更简单,把数据库能做的都给数据库做,简化代码不是更好?
rrfeng
2018-01-20 21:19:08 +08:00
用 MongoDB,支持 capped collection,自动滚动哦亲(手动斜眼

一共就 30 条的话每次插完删一次不就好了
hsuan
2018-01-20 21:21:34 +08:00
你怕是对栈有什么误解
gouchaoer
2018-01-20 21:23:16 +08:00
签到记录表 record:
id
uid
created_at
log
给 uid 和 created_at 加上联合索引,每次签到插入之后,select 该 uid 所以记录,超过 30 就删


另外不要用 mongo 不要用 mongo 不要用 mongo
alcarl
2018-01-20 21:34:11 +08:00
这是有点想多了。。。。。
wupher
2018-01-20 21:36:32 +08:00
如果 30 天是指按月保存的话。最简单,每月自动建张表就可以了。

比如每月 1 日,根据当前日期,自动判断表名,将记录添加至该表中。表可预告建好三年。

月底时不需要就自己删除以前的表。

其实你这个签到记录就算保留着也没什么大问题啊。


:-) 另外如果担心签到的人多造成数据太多,可以用 mongo,可以用 mongo , 可以用 mongo
skywolf
2018-01-20 21:53:25 +08:00
你在数据库里放个触发器不就好了么,数据插入时触发数据分析操作。
lihongjie0209
2018-01-20 23:23:32 +08:00
首先, 数据保存的数据和用户看到的数据是两码事.
数据库可以用标志位假删数据, 但是在用户看来数据就被删除了, 做法也就是在查询时过滤标志位而已.
同样的, 保留 30 条记录那就 limit 30, 在用户眼中系统只保留了最近 30 次的记录.
scnace
2018-01-21 00:51:31 +08:00
为啥要删 ORDERBY create_date DESC LIMIT 30 不好吗… 还有 你的需求真的是栈吗 栈是 FIFO 的啊,而你要的是最近的 30 条吧

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

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

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

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

© 2021 V2EX