具有多种选择的实体的数据库设计
Database design for entities with many options
我正在寻找解决以下要求的最佳方法。 "Best"这里的意思是性能胜过"beautiful"设计,我不怕丑,但性能设计。
约束条件如下:
- 我想在我的数据库中有几个
Player
。我希望那里最多有 20k 玩家。
- 那里也有一堆
Game
- 这是大约 500 个游戏的列表。游戏一旦加入就不会改变,但有时必须添加游戏。
Player
和Game
之间的关系如下:玩家要么玩游戏,要么不玩游戏,每局游戏都有一个技能(数值从1到5) .
下面是真正让我头疼的部分:我希望能够通过指定多个 Game
、一个最小技能和一个最大技能来搜索多个 Player
。因此,我有可能拥有这 500 场比赛,所有比赛都由 OR 组合而成,这会产生一个非常长的查询,但速度不是很快。我的方法是我应该以某种方式摆脱 OR 并用 AND 替换它们,但是如果有人 不是 寻找特定的 Game
,则意味着他正在寻找玩或不玩该特定游戏的玩家(因为用户对其他游戏感兴趣)。
我真的希望我遗漏了一些明显的东西或一些技巧,阻止我在每个搜索请求中都有数百个 OR-Clauses...
我用 Parse 尝试了它(因此是标签)并得到了一个错误:{"code":154,"message":"too many $or clauses"}
Player
和 Game
之间的关系将是另一个 table 例如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};
但是,如果用户可以 select 多场比赛,那就更难了。我可能会将 selected 游戏保存到某种临时 table 然后查询:
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};
我正在寻找解决以下要求的最佳方法。 "Best"这里的意思是性能胜过"beautiful"设计,我不怕丑,但性能设计。
约束条件如下:
- 我想在我的数据库中有几个
Player
。我希望那里最多有 20k 玩家。 - 那里也有一堆
Game
- 这是大约 500 个游戏的列表。游戏一旦加入就不会改变,但有时必须添加游戏。 Player
和Game
之间的关系如下:玩家要么玩游戏,要么不玩游戏,每局游戏都有一个技能(数值从1到5) .
下面是真正让我头疼的部分:我希望能够通过指定多个 Game
、一个最小技能和一个最大技能来搜索多个 Player
。因此,我有可能拥有这 500 场比赛,所有比赛都由 OR 组合而成,这会产生一个非常长的查询,但速度不是很快。我的方法是我应该以某种方式摆脱 OR 并用 AND 替换它们,但是如果有人 不是 寻找特定的 Game
,则意味着他正在寻找玩或不玩该特定游戏的玩家(因为用户对其他游戏感兴趣)。
我真的希望我遗漏了一些明显的东西或一些技巧,阻止我在每个搜索请求中都有数百个 OR-Clauses...
我用 Parse 尝试了它(因此是标签)并得到了一个错误:{"code":154,"message":"too many $or clauses"}
Player
和 Game
之间的关系将是另一个 table 例如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};
但是,如果用户可以 select 多场比赛,那就更难了。我可能会将 selected 游戏保存到某种临时 table 然后查询:
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};