可补签的签到系统的数据库的设计

今天在逛论坛的时候,突然看到一位网友提了一个问题

月签到的数据库应该怎么设计,如果错过了还可以补签?

签到截图

如图一样,每天的签到状态都显示出来了,还可以补签。我的第一想法就是:这还不简单,设计一个表,包含用户id、签到时间 两个字段不就够了?如下:

用户id签到时间
12019-09-01
12019-09-02
12019-09-03
12019-09-05

这样设计肯定是没问题的,可以实现补签功能。只要插入2019-09-04的数据就好了,但我们需要查询一整个月的数据,然后统计。同时计算连续签到天数会很麻烦。

那么计算累计签到天数很麻烦,我们添加一个累计签到天数这个字段怎么样?如下:

用户id签到时间累计签到天数
12019-09-011
12019-09-022
12019-09-033
12019-09-051

确实解决了连续签到天数计算麻烦的问题,但是如果我们需要补签2019-09-04这个时间呢?连续签到时间又需要更改,所以你还要修改2019-09-05以及这个时间之后的累计签到天数。是不是还是很麻烦?

其实还有一种方法,我们换个思路:将一整个星期或者一整个月的数据存在一行数据里面怎么样?像这样:比如说今天是九月6号:

用户id时间签到记录累计签到天数
12019-81101111110111111011111101111116
12019-91110112

看明白了吗?时间字段表达的意思是:用户1在8月签到的完整数据和9月1-6号的数据。里面的0和1代表是否签到,1:已签到,0:未签到,
计算累计签到时间,只需要从最后往前数,出现0就停止,有几个1,累计签到天数就是几。

这个用到的方法跟一个算法一样:位图算法(BitMap)
如果有兴趣可以了解一下⬇️

Last modification:October 31st, 2019 at 11:07 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment