单表操作的实战问题

来源:15-2 最佳实践

慕标4541063

2020-07-19

图片描述
老师,这是一张每日打卡的记录表,用户每天点一次打卡就会往这张表添加一条记录.假设当前用户的user_id = 1,如何查询该用户最长连续打了多少天的卡?
(我现在的做法是把该用户的所有打卡记录全部取出来放在代码层面循环遍历依据日期是否相邻以及是否打卡来计算连续打卡的最大天数.但是假如某些用户打卡了几千天,并且有很多用户同时查询,服务器的压力太过繁重,有什么更好的优化方法吗?)

写回答

3回答

双越

2020-07-22

其实获取连续打开多少天,应该不麻烦。根据 user_id 搜索出该用户所有的打开记录,逆序排序,得到一个列表。

然后遍历这个列表,遇到 is_record 打卡了,就累加打卡次数。遇到 is_record 未打开,就清零打卡次数。

这样你会得到很多阶段性的打卡次数,得到一个数组,而数组中的最大值就是你要的结果。

以上逻辑,查询一遍数据库,遍历一遍查询结果即可,时间复杂度 O(n)

0
2
双越
回复
慕标4541063
O(n) 是可以接受的。如果有高并发,你可以再考虑其他情况,例如加缓存、加机器等。
2020-07-22
共2条回复

慕标4541063

提问者

2020-07-21

双越老师,我不太懂时间复杂度.但可以给你看下我是怎么实现得到最长连续打卡天数的方法.下面的这个函数存在的最大问题就是如果list这个数组很大比如上千那就要遍历好多次.一个用户查询就遍历这么多次,要是并发起来服务器压力肯定很大.双越老师你只需要说说你的想法,给个思路我就行了,感谢!

//img.mukewang.com/szimg/5f16e0190954691506380517.jpg

0
1
双越
遍历好多次,就是时间复杂度太高。PS:时间复杂度如果不懂的话,建议你去查一查,这还是挺重要的概念。
2020-07-22
共1条回复

双越

2020-07-19

我先问一下,你觉得你的算法,时间复杂度是多少呢?


你先回复,然后我再说说我的想法。

0
0

Node.js+Koa2框架生态实战 - 从零模拟新浪微博

用 Koa2 做真正的实战项目,不再只是增删改查的小白工程师

964 学习 · 388 问题

查看课程