我正在使用PHP / MySQL制作幻想博彩联盟应用程序,我有两张桌子:
成就 - 目前通过以下列保持玩家的所有成就:
user_id
total_gold_medals
total_silver_medals
total_bronze_medals
total_bets
total_winnings
投注 - 这是每个用户下注的每个投注的列表,如果该投注被授予奖牌,以及获得多少奖金。
date_placed
user_id
winnings
gold_medal
silver_medal
bronze_medal
现在,由于预测基于实时事件,结果有时会发生变化,所以我不想在{2}表增加{2}之后再增加。{/ p>
目前,我有两个表用于类似数据的原因是因为我不想从不断增长的achievements
表中查询和COUNT / SUM,因为我只需要该数据库的一小部分用于本周。
95%的时间我只会使用bets
表格中的数据,因此我最初的想法是在2周后将数据从achievements
移至bets
传递,并使用新的achievements
字段将它们标记为“已存档”,因此它们不会包含在任何其他SUM()中。这种将数据保存在两个地方的方法似乎是一种非常笨拙的做事方式。我应该以不同的方式做事,可能会有不同的表结构吗?你会怎么做?
答案 0 :(得分:1)
目前尚不清楚您要实现的目标。原则上,对成就表的需求并不清楚,因为它可以从投注表中计算(计数,总和)。如果bets
有时间戳,则可以轻松实现最近两周的考虑。
如果您关注性能,那么为总计创建一个辅助表,所谓的聚合表(某些DB称之为物化视图)可能是一种有效的方法。
但是,当且仅当应用程序逻辑稳定且性能问题变得可预见时,我强烈建议构建性能优化。
PS:我会质疑银,铜,金柱的使用,而是为此目的引入(数字)类型的列。
答案 1 :(得分:1)
这似乎是Redis或Memcached等外部缓存的完美用例。
这个想法是在MySQL中编写昂贵的查询来计算奖牌/奖金/投注的数量和总和 - 即使它很慢。
然后运行查询并将结果放入Redis或Memcached。让您的应用程序查看缓存而不是MySQL。
优点:
作为最终建议,如果你的赌注表大约有2000万行,那么我会考虑修剪它/运行一个工作来移出旧行。
否则MySQL应该处理到那时为止的查询。