2012-04-30 8 views
0

私はゲームと呼ばれるテーブルを持っています。MySQL - インデックスの最適化 - ゲームに関連付けられたユーザー

メンバー(ユーザー名で一意)というテーブルがあります。

各ゲームでは、一度に最大6人のメンバーが参加できます。

しかし、メンバーはゲームから辞めることができます。しかし、私はまだ彼らがそのゲームに巻き込まれたという記録を残す必要があります。

は、私は、次の独立した検索を実行する必要があります。メンバーの

  1. アクティブなゲームを。

  2. メンバーを辞任されたゲーム。

  3. 空のスロット(つまり、メンバーで満たされていない場所)のゲームを検索します。

このために最適なテーブル構造は何でしょうか? 退会したすべてのゲームのリストがカンマで区切られたメンバーのためにテキストフィールドを入力する必要がありますか? (これで私が見ることができる問題は、これらのゲームのゲーム情報が最終的に必要になることです。そのため、これらのゲーム番号ごとにゲームテーブルを個別に検索する必要があります。 )

ゲームでは、SLOT1、SLOT2など現在のプレーヤーのユーザー名などの6つのテキストフィールドが必要ですか?しかし再び、退会したメンバーはどうですか? NOW

(上記のすべての混乱を引き起こした)私の質問の主要部分:

私は私のテーブルの上に私のインデックスを設定する方法を?

私は検索をしているときに、SLOTS1などを見てゲームを見て、プレーヤーのユーザー名と一致するものがあるかどうかを調べます。これは6回のOR検索です。これらのアクションのためにデータベースのインデックスを最適化するにはどうすればよいですか?

その後、各ゲームの辞任メンバーをどのようにして行うのですか。インデックスを作成するにはどうすればよいですか?

+0

どのようにあなたのメンバーのために(おそらく文字列である代わりに、ユーザー名の)整数主キーを使用して起動した場合はどうですか? –

+0

これはSLOTS1などでintを必要とするだけで助けになることがわかります。これはおそらく検索の方が速いでしょう。しかし、Indexesの主な問題は、それだけで解決されないでしょう。 – Rewind

+0

もちろん解決策ではありませんが、解決すべき重要な問題は確かです。主キーがデータに依存しない場合は重要です。メンバーが何らかの理由でユーザー名を変更した場合、大きなデータベースではかなりオーバーロードされているインデックス全体を再配置する必要があります。だから、文字列対intの問題だけではありません。 –

答えて

1

相互参照表を使用してください。これは、game(テーブルgamesへの外部キー)、user(テーブルusersへの外部キー)、およびplayer_number(1〜6の間のNULL可能な整数)の3つの列を持つテーブルで、プレーヤーが占有していることを示します; nullは、プレーヤーが辞任したことを示します)。 (あなたのゲームがどのように機能し、どのように物事を一緒にしたいかによって、バリエーションは可能ですが、主な違いはgamesusersへの外部キーです)

上記の提案の主キーはお客様の便宜のために(game, user, player_number)または(user, game, player_number)となります。

このような相互参照テーブルを検索する方が、6つの列にまたがるORを含むクエリを実行するよりも(あなたとデータベースの両方にとって)はるかに簡単です。

@Jermin Bazazianが示唆するように、usersテーブルの整数プライマリキーに切り替えることをお勧めします。

+0

以前は外来キーを聞いたことがありません。ちょうどそれらを読んでください。彼らは素晴らしいと思う。 – Rewind

+0

BTW - 私は外部キーを持っている場合、これは自動的に高速検索のインデックスとして機能しますか? – Rewind

+0

外部キーは自動的に索引付けされます。 – Hammerite

関連する問題