我目前有一个包含两个字段的GAME表
user_id,win
win = 1表示胜利,0表示丢失
假设我想要显示胜率。这对于计数操作来说是相当微不足道的。但是假设我想在同一页面上显示数千个用户,每个用户都有胜率。我对这种情况有一些可扩展性问题。使用以下字段创建单独的缓存表是不是太糟糕了
user_id,win_percentage
每次发布新游戏时都会更新。现在可以非常快速地确定胜率,而不是使用数千次计数操作。处理这个问题的最佳方法是什么?
答案 0 :(得分:3)
数据仓库人员说,将派生数据存储在数据库中始终是合适的。只要它没有更新。
问题是更新之一。
首先。您的可扩展性问题并不多。 “假设我想在同一页面上显示成千上万的用户,每个用户的胜率”并不重要。这可以非常快速地计算出来。
每次发布新游戏时都会更新。
这是存储派生数据的问题。更新的成本实际上可能超过计算成本。没有实际使用统计数据,你不知道。
因此
在证明(使用实际测量值)存储它的效率更高之前,请不要存储派生数据。
答案 1 :(得分:2)
如果衍生数据计算费用并且相对静态(它不会经常更改或根本不会更改),您应该考虑将其存储在不同的数据库中(不必是相同类型的数据库或数据库,可能类似于memcached),以便它不会影响事务数据库的性能。
如果它不是性能问题(计算成本不高),那么不必担心增加的复杂性,缓存很难做到正确。
您已经测量并确定这是一个问题而不仅仅是认为这可能是一个问题吗?
请记住,我解释道:
没有剖析的过早优化是万恶之源!
数据结构的变化可能是更好的解决方案。
user_id, wins, loses, percentage
为每个玩家更新单个记录不会再花费更多,并且可能更少,这取决于数据库,而不是每个游戏结果和结果计算的行。