Mysql 设计';总计';数据库中的字段

Mysql 设计';总计';数据库中的字段,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我试图为我的数据库(MySQL)找到一个最佳的解决方案,但我被是否存储Total列的决定所困扰 这是我的数据库的简化版本: 我有一个团队表,一个游戏表和一个“分数”表游戏将有{teamId,scoreId,…}而得分表将有{scoreId,Score,…}(此处…表示表中的其他列) 在主页上,我需要显示带有分数的团队列表。随着时间的推移,团队数量将增长到100个,而得分列表将增长到100000个。以下哪种是首选方式: 我是否应该总结分数,并在每次请求页面时与团队一起显示。(我不想缓存,因为分数

我试图为我的数据库(MySQL)找到一个最佳的解决方案,但我被是否存储
Total
列的决定所困扰

这是我的数据库的简化版本:

我有一个
团队
表,一个
游戏
表和一个“分数”表<代码>游戏将有
{teamId,scoreId,…}
得分
表将有
{scoreId,Score,…}
(此处…表示表中的其他列)

在主页上,我需要显示带有分数的团队列表。随着时间的推移,团队数量将增长到100个,而得分列表将增长到100000个。以下哪种是首选方式:

  • 我是否应该总结分数,并在每次请求页面时与团队一起显示。(我不想缓存,因为分数会不断变化)
  • 我是否应该在
    团队
    表中设置一个
    总分
    字段,在该字段中,每次将新分数添加到该组的分数表时,我都会更新该团队的总分

这两种方法中哪一种更好?或者还有其他更好的方法吗?

在请求时计算总和的准确性更好,但效率更差

在字段中缓存总计(显著)提高了某些查询的性能,但增加了代码复杂性或可能显示陈旧数据(如果不是同时更新缓存值,而是通过cron作业更新缓存值)


由你决定!:)

取决于你的分数更新的频率以及“分数”的确切含义

案例1:乐谱是现场乐谱 如果“得分”是现场得分,比如“板球或棒球得分”或“排球或乒乓球得分”,那么我真的不理解显示“跑步”得分“总和”的必要性。然而,在某些情况下,这可能也是一项要求,比如显示一支球队迄今为止的总得分+正在进行的(现场)比赛中迄今为止的得分

在这种情况下,我建议您另一种选择,即您的第一个和第二个选择的组合

团队表中的总评分将是好的,数据模型略有变化。那是

在分数表中添加一个名为LIVE的新列,对于已完成的比赛,该列为0;对于LIVE比赛,该列为1(可选-1,表示比赛即将开始,但分数不会得到更新)

现在把两张桌子合起来

select team_id,sum(total_sore) from (
select team_id,total_score from team
union
select team_id,sum(score) total_score from scores where live = 1 group by team_id)subquery
group by team_id
案例2:分数只是一个结果 直接查询数据库(您的第一个选项),因为结果只有在游戏结束后才会更新,而更新实际上是分数表中的一个新条目


如果我的假设是正确的,分数只有在游戏结束后才会更新。此外,当考虑到一个团队所玩的游戏时,更新的频率可能会更低。

在决定存储计算值时,我使用两个准则。在最好的情况下,这两种说法都是正确的

1) 该值在计算上必须非常昂贵。
2) 该值必须具有较低的更改概率

如果计算值很高,但每天都有变化,我可能会考虑每晚更新值。 开始时不使用“总计”列,仅当您开始出现性能问题时才添加它。

我同意,除了数据库的月末快照等特殊情况外,不应使用计算值


我只需创建一个视图,视图中有一列与计算的总列相等。然后可以查询视图而不是基表。

除非必须,否则不要将计算值存储在事务数据库中。好的。我只是想了解:你能给我一个例子,如果查询性能至关重要,我将“绝对必须”吗?@TJ-。例如,我将加入cadrell0:不要存储计算值。根据您的硬件和表大小,如果性能开始变差,您仍然可以决定稍后取消规范化。但有了你们指出的数量和适当的索引,我真的认为这不应该是一个问题。我想我将不得不使用Total列。不过,谢谢你的提示。