【发布时间】:2014-02-07 00:07:22
【问题描述】:
可以将以下场景与 StackExchange 信誉系统进行比较。我想知道在性能和可扩展性方面哪种方法最好。
场景:我有一个游戏网站,我需要为用户颁发奖牌奖励。每枚奖牌显然都有自己的要求。示例:参加一定数量的比赛;连胜;一场比赛的前1名;等等
选项 1:如果在注册新匹配时满足条件,则将记录存储在连接表 (users_medals) 上。一开始这会更简单、更快,但很难跟踪未来条件的变化(例如:增加某些奖牌所需的胜利次数)。
选项 2:每次用户浏览用户个人资料时,不要存储任何关系并执行所有计算。它可以轻松处理条件的变化,但是用户和奖牌越多,显示用户信息的速度就越慢,更糟糕的是,显示用户列表。
【问题讨论】:
-
选项3:运行计划任务以检测新奖牌并保留结果。
-
关于选项 2 - 在不断变化的条件下,你真的会拿走来之不易的奖牌吗?
-
嗯,是的,在某些情况下我必须这样做。改变标准的一个常见原因是平衡事情。如果老用户有更多的勋章,那对新用户是不公平的,因为在新用户加入之前要求更容易。但是,是的,它至少应该可以选择保留旧奖项。
-
@MitchWheat 你能详细说明一下吗?这种方法在类似的系统(例如 stackoverflow)上更常见吗?与选项 1 相比,我在那里看到的一个优势是,我可以更好地控制标准的更改(以及随之而来的获得奖牌的更改)何时生效。但我仍然希望用户在比赛结果发布后立即看到他们的收入。我想在这种情况下,我应该在比赛后正常检测和存储奖励,并让计划任务稍后在适用时更正它们(标准已更改)。
标签: database-design scalability database-performance