我正在尝试解决复杂的事情(因为它在我看来)。
我有下一个实体:
PLAYER(其中很少,名字如“John”,“Peter”等)。每个都有唯一的ID。为简单起见,我们认为这是他们的名字。
游戏(很少有人说,名为“捉迷藏”,“跳跃和奔跑”等)。相同 - 每个都有唯一的ID。为简单起见,现在让它成为它的名字。
SCORE(数字)。
那么,它是如何运作的。
每个玩家可以玩多个游戏。他在每个游戏中获得了一些分数。
我需要建立评级表 - 而不是一个!
表#1:大部分玩GAMES 表#2:所有游戏中最好的玩家(比如每个游戏中的总得分)。 表#3:每个GAME的最佳玩家(特别是那个GAME的SCORE)。
我可以马上建立一些东西,但那不行。 我将有超过10,000名球员;和15场比赛,肯定会增长。 对于游戏中的玩家,得分可以低至0,并且高达1,000,000(不确定此时是否可以更高)。所以我真的需要一些相关数据。
有什么建议吗?
我计划用SQL做,但可能只是用它来进行键值存储;任何事情 - 欢迎任何想法。
谢谢!
答案 0 :(得分:5)
我会说两件事。
首先我回答你的问题。其次我认为你应该做的事情。
<强> 1。回答:强>
SQL,它易于开发和测试+生产一段时间。 玩家的表,INT或其他uniq值,不是字符串。 (我知道你说它是一个样本,但是去寻找那些应该给你足够的唯一ID的“长字” 游戏也一样。现在,将高分保持在一起的方法是在两者之间建立关系。
得分(表格关系):
[Player ID][Game_ID][Score]
分数是一个数值...我不知道你的每个游戏的最高分数,所以你弄清楚什么类型就足够了。
现在,这应该很容易实现一个开始。让它工作。但是不要直接对数据库进行每次调用。
制作3层架构。创建一个数据层和一个业务层,然后是“游戏”层。 因此,每个游戏都使用自己的“游戏ID”调用业务层,如:
PlayerSaveScore(int gameID, int playerID, int score)
然后,Businesslayer会检查“参数”的大小是否正确并且是有效的ID,或许可以验证此玩家实际在过去5分钟内是否在会话中等等。
验证后,Businesslayer将数据层调用为“更新表”,数据层首先查看该记录是否存在。如果没有,那么它会插入它。
层级设计 一旦你“在线”(在空中)并且游戏变得流行,那么你就可以开始“升级”了,但你现在仍然能够通过“未来的可扩展解决方案”开始。请记住,每个游戏都必须调用业务对象/层,而不是直接 - 永远不要!
我一直在同样“想过这么多次”,但我不断进入一个叫做准备的简单循环,但这几乎从来没有让我进入一个快速运行的现实解决方案。
首先获得10万名玩家!然后开始担心它何时会超越。
<强> 2。部分......如何扩展...建议:
所以这就是构建“businesslayer / webservices”所有麻烦的原因...... 最重要的是,你的速度问题现在可以很好地解决了。
您可以非常简单地实现“缓存”。
你制作一张额外的桌子,如果你只有15场比赛,你就不需要一张桌子。游戏,但你决定。那只能保持每场比赛的前100名。每次从玩家发布新记录时,都会在此“前100名”上进行选择,并检查发布的值是否进入列表。如果是这样,那么通过更新前100个表并为了额外的速度目的来处理它。
将Top 100的摘录构建为静态数据列表,例如。 XML或类似的静态数据。根据您的平台,您可以选择正确的“静态格式”。
你甚至可以进一步提高速度。只需保持每场比赛前100名所需的最小值。这将是一个记录pr。游戏。
然后将玩家得分与游戏的“前100名中的最低得分”进行匹配......如果超过,那么你有一些“缓存/索引”要做,然后你称之为“巨型”:o)
明白这一点?我知道这是一个很长的答案,但我想给你一个“完整”的解决方案。
希望您将此标记为您的答案:o)
答案 1 :(得分:0)
我不明白为什么用一个得分表和简单的SQL查询无法解决这个问题:
(未经测试的伪SQL)
create table scores {
player_id as integer,
game_id as integer,
score as integer
}
大多数玩游戏:SELECT count(*) AS c FROM scores GROUP BY game_id ORDER BY c DESC
最佳玩家:SELECT sum(score) AS s FROM scores GROUP BY player_id ORDER BY s DESC
特定游戏中的最佳玩家:SELECT * FROM scores WHERE score=(SELECT max(score) FROM scores WHERE game_id=$given_game) LIMIT 1
如果您需要同时获得所有游戏中最佳玩家的列表,您可以稍微延长最后一个查询(这可能会通过加入进行优化,但现在考虑到现在还为时尚早)
您所谈论的行数在数据库方面很小。如果您也缓存查询结果(例如,通过类似memcached或在您的RoR应用程序中),那么您根本就不会触及数据库。