qiayue
V2EX  ›  问与答

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

  •  
  •   qiayue ·
    PRO
    · Mar 2, 2015 · 2667 views
    This topic created in 4118 days ago, the information mentioned may be changed or developed.
    拿一个玩游戏的具体例子举例:
    用户表 user 有 coin (金币)字段
    游戏得分表 game_score 用于记录用户的每一次游戏得分
    金币明细表 coin_detail 用于记录每一次金币的变动
    金币按天统计表 coin_day 用于记录每个用户每天的金币变动汇总
    金币按月统计表 coin_month 用于记录每个用户每月的金币变动汇总

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

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

    这里两个才是关键,其他的都是一些结果数据吧。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   903 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:18 · PVG 04:18 · LAX 13:18 · JFK 16:18
    ♥ Do have faith in what you're doing.