ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

打卡类应用的数据模型与统计口径怎么设计?以念叙流年为例

打卡类应用的数据模型与统计口径怎么设计?以念叙流年为例 打卡类应用的数据模型与统计口径怎么设计以念叙流年为例做习惯打卡这类看起来很简单的应用真正难的不是打卡按钮而是底层的数据模型和统计口径。一个日期字段的边界处理不当就会让用户看到假完成“假连续”进而彻底失去信任。本文以「念叙流年」为例聊聊打卡类应用在数据与统计设计上要注意什么。一、先理解打卡数据的核心矛盾打卡应用表面是记录某天做了某事实际要回答四个问题今天做了没有日粒度的幂等判断连续做了多少天连续统计累计做了多少天累计统计这些数据可信吗口径一致性前三个是功能第四个是产品命门。用户一旦发现数据对不上比如明明打了卡却显示没打就会彻底放弃。所以统计口径设计往往比UI 更重要。二、日志模型以天为幂等单元 快照计价1. 幂等设计一天一条按天去重。打卡记录不能简单地每次点击插一行否则网络重试、用户连点都会产生重复记录。正确做法是以习惯ID, 日期作为幂等单元——同一天重复提交不写第二笔。累计天数也应按日期去重统计而非简单count 行数。2. 统计日志窗口不丢历史可配置。打卡统计接口需要支持时间窗口参数默认返回最近 365 天最大可放宽到 3650 天。窗口下界要有兜底逻辑——不能越过习惯开始日否则会把习惯还不存在的日子错标成未打卡。3. 省钱累计单价快照隔离历史。对花钱类习惯戒烟、戒酒累计省下的钱时不能用当前单价回算历史否则用户改一次单价历史账目全乱。正确做法是每天记录当天单价快照历史金额固化。改价只影响之后的计算。三、统计口径连续 vs 累计两个不同的判据这是打卡应用最容易混淆的地方累计天数streak 里的累计只要这天打了就算按日期去重统计只增不减常用于 7 / 30 / 100 天里程碑判定——因为里程碑看的是你坚持了多久不该因为断一天就归零。当前连续天数true streak从今天或昨天往回数连续打卡的天数断一天就重新计算。两者服务不同目的必须分开实现不能共用一个字段。搞混的结果就是断了之后里程碑也跟着清零用户会认为之前的坚持白费了。四、防假完成跨天守卫与双判据1. 跨天守卫最容易踩的坑。应用冷启动、断网重连时本地缓存的可能是昨天的数据。如果直接渲染完成状态用户会看到昨天打的卡被当成今天已打卡。所以判断今天完成没时必须校验记录的日期是否等于今天是则完成态否则显示未完成。这就是跨天守卫。2. 服务端与本地双判据。不信任单一来源本地显示的状态只是即时反馈最终与云端对齐。数据一致性由服务端兜底本地与服务端各自判据明确避免假完成、假安心。五、关系模型关爱者双向关联 权限边界打卡应用常常还要支持家人互相看进度这就需要一张双向关系表关系双建长辈侧生成邀请码家人接受后成为关爱者关系记录双方。权限边界关爱者能看对方打卡进度但查看逐习惯明细需要对方开启明细可见——默认不给尊重隐私。提醒克制红点提醒只在对方有习惯但今天一个都没打时亮打了哪怕一个就不打扰。远程关爱最忌变成骚扰。邀请码设计长码可无状态生成可转发多人短码6 位数字落库仅登录后接受公开接口不认——避免短码被探测。六、给打卡类应用的几条设计建议综合上面做打卡类应用技术上值得记的统计口径优先于功能——宁可功能少也要保证完成/连续/累计绝对可靠这是信任基础。区分累计和连续——里程碑用累计不归零当前连通用真实连续分开实现。幂等从底层做起——(习惯, 日期) 唯一约束避免脏数据。历史不可变——改单价、改设置都不能污染已记录的数据用快照隔离。跨天要守卫——任何今天完成没的判断都要校验日期防缓存导致的假完成。远程功能要克制——默认最小权限提醒宁可少亮不轰炸。如果你也在做打卡/习惯养成类应用欢迎交流——这块的细节坑比界面多得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进