跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

签到的需求,怎么做才好。

商城接到一个需求,有以下几个要求: 增加签到的功能,1号签到增加1个积分,2号签到增加2个积分,以此类推。 连续签到第6日,15日,25日分别奖励积分50,70,100个积分。 每天能补签一次。 用户能查看历史几个月的签到记录。 签到好做,用ajax提交就好。 可是问题是:根据以上需求,怎么存储数据较好。 第一种: 把签到的日期放在
sign_record
中,以逗号隔开。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 user_iddate_monthsign_record12015-081,2,3,4,5,7,8,9,10...22015-087,8,9,10...32015-081,7,8,9,10............ 第二种: 把签到的日期放在
sign_record
中, user_iddatesign_record12015-08112015-08212015-08312015-08422015-082......... 第三种: 上面两种的话我偏向于第一种,但是可能不符合三范式。 有没有其他的方式来存储呢,请大大们支招。 回复内容: 商城接到一个需求,有以下几个要求: 增加签到的功能,1号签到增加1个积分,2号签到增加2个积分,以此类推。 连续签到第6日,15日,25日分别奖励积分50,70,100个积分。 每天能补签一次。 用户能查看历史几个月的签到记录。 签到好做,用ajax提交就好。 可是问题是:根据以上需求,怎么存储数据较好。 第一种: 把签到的日期放在
sign_record
中,以逗号隔开。 user_iddate_monthsign_record12015-081,2,3,4,5,7,8,9,10...22015-087,8,9,10...32015-081,7,8,9,10............ 第二种: 把签到的日期放在
sign_record
中, user_iddatesign_record12015-08112015-08212015-08312015-08422015-082......... 第三种: 上面两种的话我偏向于第一种,但是可能不符合三范式。 有没有其他的方式来存储呢,请大大们支招。 刚好我以前做过类似的一个数据库设计,给你一个思路 这个明显是需要两张表来进行共同存储(就是把你的第一张表跟第二张结合) 表A存储的为 | user id | last sign| con sign count | | 1 | 2015-08-28 | 2 | 这个con sign count存储的是用户连续签到的天数 表B跟你表二的结构一样 这其实是两个需求,一个需求叫连续签到获得积分,另一个需求叫查看签到记录 表A你可以理解为统计表 每次用户签到的时候判断逻辑为 1用户签到 2查询表B判断是否为连续签到(查询昨天的签到记录)
2.1 true 用户连续签到天数+1,并计算签到积分 2.2 false 2.2.1 判断是否补签(不太清楚你补签的需求是怎样,是前天签到的话就查询记录) 2.2.1.1 true 补签逻辑 2.2.1.2 false 将用户的连续签到天数重新置为1 3在表二中插入一条今天的签到的数据记录
流程结束
sign(user_id,date_month,sign_records)
我也认同楼主采用第一种. 因为查询的条件主要还是落在
user_id
和
date_month
上, 然后拿到用户的签到记录
sign_records
, 再用explode以逗号分割转成数组进行积分计算. 建议
date_month
使用时间戳存储:
strtotime('2015-08')
得1438358400 字段类型刚好可以选择int(10),同时建立索引,加速查询. 因为签到记录
sign_records
都是整数,可以用
intval()
保证插入的值是整数. 以逗号分隔存入字段并无不妥,省去了序列化或者JSON的编解码操作,同时还方便使用MySQL的
FIND_IN_SET
函数以
sign_records
字段为条件进行查询,这都是逗号分隔的好处: 比如查询在8月1日签到的用户:
SELECT `user_id` FROM `sign` WHERE `date_month` = 1438358400 AND FIND_IN_SET('1', `sign_records`);
个人见解是: 1.数据表的字段“data month”改为“data day”按天来记录签到。 2.具体的分值根据签到天数计算:
a.比如:初始分值设为1,第二天签到的同时更新用户的签到分值,并且判断用户前一天是否签到。如果签到则第二天分值增加比前一天多1分。 b.当增加的分值等于6时,表示用户连续签到了6天,则给当天的分值增加(1+49)[其中的"1"表示每天增加1,49是常数,为了凑要求的分值]分 c.当增加的分值等于15时,表示用户连续签到15天,则给当天的分值增加(1+69)分。 d.其他一次类推。
我不是大神,只是说说我的看法。 使用JSON存储 MySQL的话建议用JSON, MySQL 5.7原生JSON格式支持. 用某种符号进行分割建议尽量避免, 日期比较简单. 如果复杂的数据就很容易出错. 能有稳健的数据结构就用数据结构. 使用触发器 可以使用触发器来处理积分什么的. 第一种,但是增加一个字段,就是连续签到次数,补签应该是出发比较少的行为吧

相关文章