我有一个名为games的表(由int独特)。
我有一个名为members的表(用户名唯一)。
在每场比赛中,一次最多可以有6名成员参与。
然而,会员可以从游戏中退出 - 但我仍然需要保留他们参与该游戏的记录。
我需要进行以下单独搜索:
会员的有效游戏。
会员退出游戏。
在游戏中搜索空位(即未由成员填充的位置)。
最好的表格结构是什么? 我是否应该为一个成员添加一个文本字段,其中包含以逗号分隔的所有已退出游戏的列表? (我可以看到的一个问题是我最终需要这些游戏的游戏信息,所以我随后需要在游戏桌上为这些游戏编号单独搜索。这对于服务器而言似乎真的很慢。 )
在游戏中,我应该有6个文本字段,例如SLOT1,SLOT2等与当前玩家的用户名?但是,再一次,辞职的成员呢?
现在是我的问题的主要部分(导致上述所有混淆):
如何在表格上设置索引?
当我进行搜索时,我会查看看SLOTS1等的游戏,看看是否与玩家的用户名有任何匹配。所以这是一次6次ORed搜索。如何针对这些操作优化数据库的索引?
然后根据每个游戏的辞职成员的方式,我该如何做一个索引呢?
答案 0 :(得分:1)
使用交叉引用表。这是一个包含三列的表,game
(表games
的外键),user
(表users
的外键)和player_number
(1到6之间的可空整数,表示玩家占用哪个“座位”; null表示玩家已辞职)。 (这可能会有所不同,具体取决于你的游戏如何运作以及你希望东西如何组合在一起,但主要的是你有games
和users
的外键。)
上述建议中的主键在您方便时为(game, user, player_number)
或(user, game, player_number)
。
搜索这样的交叉引用表要比在六列中进行ORing的查询要容易得多(对你和你的数据库来说)。
根据@Jermin Bazazian的建议,切换到users
表的整数主键可能是个好主意。