商城接到一个需求,有以下几个要求:
增加签到的功能,1号签到增加1个积分,2号签到增加2个积分,以此类推。
连续签到第6日,15日,25日分别奖励积分50,70,100个积分。
每天能补签一次。
用户能查看历史几个月的签到记录。
签到好做,用ajax提交就好。
可是问题是:根据以上需求,怎么存储数据较好。
第一种:
把签到的日期放在sign_record
中,以逗号隔开。
user_id | date_month | sign_record |
---|---|---|
1 | 2015-08 | 1,2,3,4,5,7,8,9,10... |
2 | 2015-08 | 7,8,9,10... |
3 | 2015-08 | 1,7,8,9,10... |
... | ... | ... |
第二种:
把签到的日期放在sign_record
中,
user_id | date | sign_record |
---|---|---|
1 | 2015-08 | 1 |
1 | 2015-08 | 2 |
1 | 2015-08 | 3 |
1 | 2015-08 | 4 |
2 | 2015-08 | 2 |
... | ... | ... |
第三种:
上面两种的话我偏向于第一种,但是可能不符合三范式。
有没有其他的方式来存储呢,请大大们支招。
回复内容:
商城接到一个需求,有以下几个要求:
增加签到的功能,1号签到增加1个积分,2号签到增加2个积分,以此类推。
连续签到第6日,15日,25日分别奖励积分50,70,100个积分。
每天能补签一次。
用户能查看历史几个月的签到记录。
签到好做,用ajax提交就好。
可是问题是:根据以上需求,怎么存储数据较好。
第一种:
把签到的日期放在sign_record
中,以逗号隔开。
user_id | date_month | sign_record |
---|---|---|
1 | 2015-08 | 1,2,3,4,5,7,8,9,10... |
2 | 2015-08 | 7,8,9,10... |
3 | 2015-08 | 1,7,8,9,10... |
... | ... | ... |
第二种:
把签到的日期放在sign_record
中,
user_id | date | sign_record |
---|---|---|
1 | 2015-08 | 1 |
1 | 2015-08 | 2 |
1 | 2015-08 | 3 |
1 | 2015-08 | 4 |
2 | 2015-08 | 2 |
... | ... | ... |
第三种:
上面两种的话我偏向于第一种,但是可能不符合三范式。
有没有其他的方式来存储呢,请大大们支招。
刚好我以前做过类似的一个数据库设计,给你一个思路
这个明显是需要两张表来进行共同存储(就是把你的第一张表跟第二张结合)
表A存储的为
| userid | lastsign| consigncount |
| 1 | 2015-08-28 | 2 |
这个consigncount存储的是用户连续签到的天数
表B跟你表二的结构一样
这其实是两个需求,一个需求叫连续签到获得积分,另一个需求叫查看签到记录
表A你可以理解为统计表
每次用户签到的时候判断逻辑为
-
1用户签到 2查询表B判断是否为连续签到(查询昨天的签到记录)
<code> 2.1 true 用户连续签到天数+1,并计算签到积分 2.2 false 2.2.1 判断是否补签(不太清楚你补签的需求是怎样,是前天签到的话就查询记录) 2.2.1.1 true 补签逻辑 2.2.1.2 false 将用户的连续签到天数重新置为1 3在表二中插入一条今天的签到的数据记录 </code>
流程结束
<code>sign(user_id,date_month,sign_records)</code>
我也认同楼主采用第一种.
因为查询的条件主要还是落在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日签到的用户:
<code>SELECT `user_id` FROM `sign` WHERE `date_month` = 1438358400 AND FIND_IN_SET('1', `sign_records`); </code>
个人见解是:
1.数据表的字段“datamonth”改为“dataday”按天来记录签到。
2.具体的分值根据签到天数计算:
<code>a.比如:初始分值设为1,第二天签到的同时更新用户的签到分值,并且判断用户前一天是否签到。如果签到则第二天分值增加比前一天多1分。 b.当增加的分值等于6时,表示用户连续签到了6天,则给当天的分值增加(1+49)[其中的"1"表示每天增加1,49是常数,为了凑要求的分值]分 c.当增加的分值等于15时,表示用户连续签到15天,则给当天的分值增加(1+69)分。 d.其他一次类推。</code>
我不是大神,只是说说我的看法。
使用JSON存储
MySQL的话建议用JSON, MySQL 5.7原生JSON格式支持.
用某种符号进行分割建议尽量避免, 日期比较简单. 如果复杂的数据就很容易出错. 能有稳健的数据结构就用数据结构.使用触发器
可以使用触发器来处理积分什么的.
第一种,但是增加一个字段,就是连续签到次数,补签应该是出发比较少的行为吧

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。