背景:
我想创建一个可以运行 1 对 1 比赛的数据库。它需要跟踪每场比赛的获胜者和失败者以及有关该比赛的任何评论,并随机决定下一场独特的比赛。
规则:
有x个玩家。每个玩家最终将与其他玩家玩一次,实际上涵盖了所有可能的独特玩家组合。
数据库表(带有示例数据):
DECLARE @Players TABLE (
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50)
)
ID Name
-- -----
1 Alex
2 Bob
3 Chris
4 Dave
DECLARE @Matches TABLE (
ID INT PRIMARY KEY IDENTITY,
WinnerId INT,
LoserId INT
)
ID WinnerId LoserId
-- -------- -------
1 1 2
2 4 2
3 3 1
DECLARE @Comments TABLE (
ID INT PRIMARY KEY IDENTITY,
MatchId INT,
Comment VARCHAR(MAX)
)
ID MatchId Comment
-- ------- ------------------------------
1 2 That was a close one.
2 3 I did not expect that outcome.
问题:
- 如何有效地查询以获得尚未发生的单个随机匹配?
主要问题是玩家的数量会随着时间的推移而增长。现在在我的示例数据中,我只有 4 名球员,剩下 6 场可能的比赛。
Alex,Bob
Alex,Chris
Alex,Dave
Bob,Chris
Bob,Dave
Chris,Dave
这将足够小,只需继续抓取与玩家 id 相对应的 2 个随机数,然后检查匹配表是否已经发生该匹配。如果有:再拿 2 个并重复该过程。如果还没有,则将其用作下一场比赛。但是,如果我有 10,000 名玩家,那将是 49995000 次可能的对决,它只会变得太慢。
谁能指出我正确的方向以进行更有效的查询?如果这也有助于提高效率,我对数据库设计的更改持开放态度。