V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qiayue
V2EX  ›  问与答

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

  •  
  •   qiayue · 2015-03-02 11:40:00 +08:00 · 2098 次点击
    这是一个创建于 3556 天前的主题,其中的信息可能已经有所发展或是发生改变。
    拿一个玩游戏的具体例子举例:
    用户表 user 有 coin (金币)字段
    游戏得分表 game_score 用于记录用户的每一次游戏得分
    金币明细表 coin_detail 用于记录每一次金币的变动
    金币按天统计表 coin_day 用于记录每个用户每天的金币变动汇总
    金币按月统计表 coin_month 用于记录每个用户每月的金币变动汇总

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

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

    这里两个才是关键,其他的都是一些结果数据吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5544 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.