求问优化思路:用户的一个操作产生的数据会影响多张表,有 insert 也有 update

2015-03-02 11:40:00 +08:00
 qiayue
拿一个玩游戏的具体例子举例:
用户表 user 有 coin (金币)字段
游戏得分表 game_score 用于记录用户的每一次游戏得分
金币明细表 coin_detail 用于记录每一次金币的变动
金币按天统计表 coin_day 用于记录每个用户每天的金币变动汇总
金币按月统计表 coin_month 用于记录每个用户每月的金币变动汇总

现在,用户玩了某个游戏,得分 83 ,系统奖励 10 金币,需要做以下操作:
1、更新用户表,使金币字段+10
2、游戏得分表插入一条 83 分的记录
3、金币明细表插入一条增加 10 金币的记录
4、金币按天统计表,查看是否有该用户的今天记录,没有则插入一条记录,有则更新使金币+10
5、金币按月统计表,差看是否有该用户的本月记录,没有则插入一条记录,有则更新使金币+10
当然以上都是事务操作,只要有一个不成功就需要回滚。

以上是业务逻辑,目前数据表也是按照上面的逻辑去建的五张表,请问这种业务是否有更好的处理方式?从表的设计上优化或者程序处理的优化。
请给个思路,谢谢!
2106 次点击
所在节点    问与答
5 条回复
delphiqin
2015-03-02 12:30:39 +08:00
只有1,2需要保证事务一致,记录如果只是用于统计,可以允许少量数据缺失。
3,4,5通过在记录表里增加时间字段就可以合并成一条记录
在统计的时候,取记录,按天/按月 group 就可以了
wingoo
2015-03-02 12:32:46 +08:00
1可以先放cache, 隔段时间入库一次,反正有总的明细表, 即使cache丢掉也可以重跑出来
4,5 实时性的要求怎样?是否可以做成后台job去跑明细表得出
barbery
2015-03-02 13:13:31 +08:00
明细表的操作,可以考虑丢到队列里异步去跑
统计的用cron 晚上闲时的时候再跑。。。
liuhaotian
2015-03-02 13:14:04 +08:00
游戏结束,操作1、2、3。
每天凌晨执行crontab select * from xxx where time > a and time <b and uid=c 统计完毕后计入按天统计表。
每月开始第一天执行crontab 查询按天统计表进行计算。
实际上系统出账有的就是这么做的。
invite
2015-03-02 16:34:50 +08:00
2、游戏得分表插入一条 83 分的记录
3、金币明细表插入一条增加 10 金币的记录

这里两个才是关键,其他的都是一些结果数据吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/173912

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX