バックグラウンド:
1対1の対戦のトーナメントを実行できるデータベースを作成したいと思います。各対戦の勝ち負けとその対戦に関するコメントを追跡し、次のユニークな対戦をランダムに決定する必要があります。
ルール:
x人のプレイヤーがいます。各プレーヤーは、最終的には他のすべてのプレーヤーを1回プレイし、事実上、プレーヤーのすべての可能な固有の組み合わせをカバーします。
データベーステーブル(サンプルデータ付き):
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の可能な対戦になり、単純に遅くなります。
より効率的なクエリのために、誰かが私を正しい方向に向けることができますか?データベース設計の変更も、それが物事をより効率的にするのに役立つのであれば、私はオープンです。