2011-12-15 37 views
-1

我正在构建一个“Spot the diffrence”多人游戏。更高效的SQL查询

游戏的specifiactions是:

  1. 最多可以有10名球员在每场比赛。
  2. 用户不得两次看到相同的图片。
    (一张图片由 四张图片组成,用户必须“发现它们之间的差异”)

我有数千,数千的 甚至可能几十图片集选择。我面临的问题是非常有效且不可扩展的方法,用于查找没有任何 游戏玩家已经看到的图片。

在我的数据库我有以下字段的usage table

  1. picture_id
  2. USER_ID

我目前的解决方案如下:

用户进入游戏,应用程序会从数据库中选择一张不会出现的图片i在该用户的使用表中,并且对于进入的每个用户,我运行相同的功能,只添加同一游戏中的其他用户已经看到的图片的值。

我担心的是,一旦有成千上万张图片的数据库可供选择,并且使用表已被前面的游戏填满,则该功能将花费太长的时间来损害游戏的流程。

这种方法不具有很好的可扩展性,我期待着持续流量的稳定流动,这意味着很多正在玩的游戏。


有没有人有任何建议如何改善这个逻辑或建议更好的数据库结构?

回答

4

您可以简单地添加一个字段到图片表(而不是用户/图片映射),标记图片是否已被使用。您可以随时在使用图片时设置该标志,并对该字段进行索引以快速识别未使用的图片。这有效地将结果缓存到hasBeenUsed()函数。

有些人可能会以各种各样的理由反对,而这种过早的优化会导致高度混乱和非常紧密的耦合结构。惩罚未来的可维护性。

另一种方法是在用户/图片映射表中每图片都有。如果未使用图片,则其关联的user_id保留为NULL。首先使用picture_id的索引可以快速识别未使用的图片。

但最重要的是,它实际上取决于您必须进行此随机选择的查询。很多时候(但并非总是)可扩展性差的算法可以用更多的可扩展算法来替代,而无需改变数据库结构。但要知道我们需要查看您的查询,以及有关数据的模式和行为信息(约束条件,可能未使用的百分比等)。

+0

感谢您的贡献 - 这正是我一直在寻找的建议类型。 – Lix

0

10个用户对10,000张图片 - 使用概率论,您需要选择11张图片(我建议使用一些随机的方法)在检查这11张图片后找到第一个唯一的图片。

3

我认为这是不成熟的优化。

尽管“成千上万”听起来像很多人,但对于SQL引擎来说几乎没有什么。有些实现甚至不会在50-60k行的表上使用索引,因为将整个内容加载到内存中会更快。

我建议使用EXISTS来编写查询,这在大多数实现中会出现短路,并且应该足够快以满足您的需求。

如果您发布了一些表结构和/或一些示例数据的示例代码,我们可能可以协助查询,但我认为您并不担心任何事情。

+0

JNK,你的权利可能是不成熟的。 **但是**,如果我理解这个问题,那不是关于优化,而是找到更好的数据处理方法。 – Roni

+1

问题的标题是“更有效的SQL查询”.... – JNK