1

我正在用 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

现在,由于预测是基于现场活动的,结果有时会发生变化,所以我不想在achievements2 周过去之前增加表格。

目前,我有两个用于相似数据的表的原因是因为我不想bets在本周只需要该数据库的一小部分时从不断增长的表中查询和 COUNT/SUM。

95% 的时间我将只使用achievements表中的数据,所以我最初的想法是在 2 周过去后将数据从 移动bets到,并使用新字段achievements将它们标记为“存档”,这样它们就不会了archivedt 包含在任何进一步的 SUM() 中。这种将数据保存在两个地方的方法似乎是一种非常笨拙的做事方式。我应该以不同的方式做事,也许是不同的表结构?你会怎么做?

4

2 回答 2

1

对于像RedisMemcached这样的外部缓存,这似乎是一个完美的用例。

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

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

好处:

  1. Redis 和 Memcached 将它们的数据完全存储在 RAM 中,因此查询会非常快。
  2. 如果您从数据库中进行了足够多的查询,那么无论如何您将来都需要缓存。如今,它已成为 Web 架构的标准部分。
  3. 它可以解决您提到的非规范化恐惧。换句话说,数据不会被复制到 MySQL 的其他地方。
  4. 它绝对可以保护您的数据库免受重载。

作为最后的建议,如果您的投注表有大约 2000 万行,那么我会考虑修剪它/运行一项工作以移出旧行。

否则 MySQL 应该可以很好地处理查询。

于 2013-11-09T15:57:10.437 回答
1

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

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

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

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

于 2013-11-08T14:40:36.190 回答