具有多个选项的实体的数据库设计

时间:2015-05-28 10:37:16

标签: database-design parse-platform

我正在寻找解决以下要求的最佳方法。这里的“最佳”意味着性能胜过“漂亮”的设计,我不怕丑陋而且高效的设计。

以下是限制因素:

  • 我想在我的数据库中有几个Player。我希望最多只有20k玩家。
  • 那里还有一堆Game - 这是一个大约500个游戏的列表。一旦游戏进入游戏,游戏就不会改变,但偶尔也会增加游戏。
  • PlayerGame之间的关系如下:玩家要么玩游戏要么不玩游戏,并且每个游戏都有技能(值为1到5)。 / LI>

现在这里真的让我感到头疼:我希望能够通过指定多个Player,最小技能和最大技能来搜索多个Game。所以有可能,我有这500个游戏,都是由OR组成的,这使得查询速度非常快。我的方法是我应该以某种方式摆脱OR并用AND替换它们,但是如果有人寻找特定的Game,这意味着他正在寻找玩家的玩家或者不玩那个特定的游戏(因为用户对其他游戏感兴趣)。

我真的希望我错过了一些明显的或一些技巧,以防止我在每个搜索请求中都有数百个OR-Clauses ...

我尝试使用Parse(因此是标记)并收到错误:{"code":154,"message":"too many $or clauses"}

1 个答案:

答案 0 :(得分:0)

PlayerGame之间的关系将是另一个表格,例如Player_Game列的内容如下:

  • player_id(播放器的外键)
  • game_id(游戏的外键)
  • 播放(是或否)
  • 技能(整数1-5)

因此,如果您希望能够通过指定单个游戏,最小技能和最高技能来搜索多个玩家,那么SQL查询将是:

select player_id
from   player_game
where  game_id = {GAME_ID}
and    skill >= {MIN_SKILL}
and    skill <= {MAX_SKILL};

但是,如果用户可以选择多个游戏,那就更难了。我可能会将选定的游戏保存到某种临时表中,然后查询,而不是使用多个OR或大IN列表构建查询:

select player_id
from   player_game
where  game_id in (select game_id from temp_games_list)
and    skill >= {MIN_SKILL}
and    skill <= {MAX_SKILL};