使用一个表来保存另一个较大表的COUNT / SUM是不好的设计吗?

时间:2013-11-08 14:27:29

标签: php mysql database-design

我正在使用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()中。这种将数据保存在两个地方的方法似乎是一种非常笨拙的做事方式。我应该以不同的方式做事,可能会有不同的表结构吗?你会怎么做?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚您要实现的目标。原则上,对成就表的需求并不清楚,因为它可以从投注表中计算(计数,总和)。如果bets有时间戳,则可以轻松实现最近两周的考虑。

如果您关注性能,那么为总计创建一个辅助表,所谓的聚合表(某些DB称之为物化视图)可能是一种有效的方法。

但是,当且仅当应用程序逻辑稳定且性能问题变得可预见时,我强烈建议构建性能优化。

PS:我会质疑银,铜,金柱的使用,而是为此目的引入(数字)类型的列。

答案 1 :(得分:1)

这似乎是RedisMemcached等外部缓存的完美用例。

这个想法是在MySQL中编写昂贵的查询来计算奖牌/奖金/投注的数量和总和 - 即使它很慢。

然后运行查询并将结果放入Redis或Memcached。让您的应用程序查看缓存而不是MySQL。

优点:

  1. Redis和Memcached将他们的数据完全存储在RAM中,因此查询将非常快。
  2. 如果您从数据库中进行了足够的查询,那么将来您将需要一个缓存。如今,它是Web架构的标准部分。
  3. 它照顾你提到的非规范性恐惧。换句话说,数据不会被复制到MySQL中的其他地方。
  4. 它绝对可以保护您的数据库免受重负荷的影响。
  5. 作为最终建议,如果你的赌注表大约有2000万行,那么我会考虑修剪它/运行一个工作来移出旧行。

    否则MySQL应该处理到那时为止的查询。

相关问题