累计连续签到 设计和实现

累计连续签到 设计和实现

功能要求

  • 签到
  • 补签
  • 统计某用户截至今天连续打卡天数
  • 统计某用户在某一天打卡排名
  • 统计某用户截至到某天连续打卡天数
  • 最高连续签到记录

下面直接上一个需求图
在这里插入图片描述

问题难点

  • 怎么用比较好方式去统计连续打卡天数
  • 怎么实现补卡功能以达到连续签到的效果
  • 怎么实现补签后连续天数的统计功能

数据库设计

以下是打卡记录表的设计和实现,我已经去掉了一些业务字段,剩下都是表结构的核心字段

CREATE TABLE mark_record (
    id             BIGINT                  NOT NULL COMMENT 'ID'
        PRIMARY KEY,
    create_time    DATETIME                NOT NULL COMMENT '创建时间',
    update_time    DATETIME                NOT NULL COMMENT '更新时间',
    user_id        BIGINT                  NOT NULL COMMENT '用户ID',
    mark_day_time  INT                     NOT NULL COMMENT '打卡日期 yyyyMMdd',
    day_continue   BIGINT       DEFAULT 0  NOT NULL COMMENT '距离上次打卡相差天数',
    mark_type      TINYINT      DEFAULT 0  NOT NULL COMMENT '补签 0否 1是',
    CONSTRAINT uidx_user_id_mark_day_time
        UNIQUE (user_id, mark_day_time)
)
    COMMENT '打卡签到表';

id/create_time/update_time 表结构的常规字段,简单提醒一下,业务上这些字段也比较重要

  • id 表的唯一主键

  • create_time/update_time 比较重要数据信息字段一般都保留

列举一个比较实用业界数据分页案例:
数据分页翻页时候,防止新增数据导致分页加载出现重复数据,一般做法是当客户端打卡当前页面那瞬间时间戳传过来,上下翻页都是用同一个时间戳,后端查询数据时候只查询小于这个时间戳的数据,大于这个时间戳的数据就不会加载出来了
其他用途就不一一列举了

  • user_id & mark_day_time 组成一个唯一索引

一个用户一天只允许打卡一次,加唯一索引保证数据唯一防止脏数据

  • mark_type 记录打卡类型

区分正常打卡和补卡

  • day_continue 冗余字段 距离上次打卡记录相差天数

以方便统计相关打卡记录数据

代码实现

打卡功能实现

markDayTime 当前打卡签到日期,userId 当前打卡用户 ID

签到功能 SQL 实现

使用 INSERT INTO SELECT 查询小于当前签到日期(markDayTime</

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对电商平台的用户签到积分系统,可以设计以下的数据库表结构: 1. 用户表(user):记录用户的基本信息,如用户ID、用户名、手机号码等。 | 字段名称 | 类型 | 主键/外键 | 描述 | | ------------- | ------------- | --------- | ---------------------- | | user_id | int | 主键 | 用户ID | | username | varchar(50) | | 用户名 | | phone_number | varchar(20) | | 手机号码 | 2. 签到记录表(checkin_record):记录用户每次签到的时间和签到的积分数。 | 字段名称 | 类型 | 主键/外键 | 描述 | | --------------- | ------------- | --------- | ---------------------- | | record_id | int | 主键 | 签到记录ID | | user_id | int | 外键 | 用户ID | | checkin_time | datetime | | 签到时间 | | checkin_points | int | | 签到获得的积分数 | 3. 连续签到记录表(continuous_checkin):记录用户的连续签到情况,包括当前连续签到天数和最长连续签到天数。 | 字段名称 | 类型 | 主键/外键 | 描述 | | ---------------------- | ------------- | --------- | ---------------------- | | continuous_checkin_id | int | 主键 | 连续签到记录ID | | user_id | int | 外键 | 用户ID | | current_days | int | | 当前连续签到天数 | | longest_days | int | | 最长连续签到天数 | 在这里,我们可以通过触发器(trigger)来自动更新用户的连续签到记录。当用户签到时,我们可以在签到记录表中插入一条新的记录,并且根据用户的签到时间和上一次签到时间,来判断是否是连续签到。如果是连续签到,则更新用户的连续签到记录;否则,重置用户的连续签到记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值