0

データベースの最適な構成を決定しようとしています。各個人の列を持つusersテーブルがありますcurrent_game。(各ユーザーは、常に1つのゲームにのみ属することができます。)特定の各ゲームが一意のIDを持つゲームテーブルがあります。

この方法で、すべてのクエリ/操作を問題なく実行できます。ただし、各ユーザーが過去のゲームの記録を保持して、ユーザーが履歴データと統計にアクセスできるようにしたいと思います。

ゲームは非常に長い間(たとえば、数週間)しか持続せず、すべてのユーザーが常にゲームに積極的に関与するわけではないため、これは私が検討していたスキーマです。

users、、、、、、users_inactive_ games_ games_old_ game_events_game_events_old

私の懸念は2です。まず、2つのユーザーテーブルがログインと登録で問題になるのでしょうか。membership次に、ユーザーとゲームの関係ごとに1行の2列のテーブルを維持する必要がありますか(つまり、過去5回のゲームに参加した8人のユーザーは、membershipテーブルに40行あることを意味します)、またはよりシンプルでエレガントな方法がありますか?

4

3 に答える 3

1

私の提案は、エンティティがアクティブであるかどうかを示すブール列を導入することです。

たとえば、「games」テーブルと「games_old」テーブルの代わりに、「games」テーブルでgame_active(ブール列)を使用して「games_old」テーブルを削除します。ビジネスロジックでは、新しいゲームをアクティブとしてマークし、古いゲームを非アクティブとしてマークする必要があります。

同じロジックが他のテーブルにも適用されます。

制約は次のようになります。

PRIMARY KEY (`user_id`, `game_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_game_id` (`game_id`),
CONSTRAINT `fk_users_user_game` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `fk_games_user_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`game_id`) ON UPDATE NO ACTION ON DELETE NO ACTION
于 2013-02-19T18:42:32.133 に答える
1

current_gameテーブルから列を削除usersし、開始タイムスタンプと終了タイムスタンプとともにユーザーとゲームを接続する新しいテーブルを追加します。次のようなもの:

CREATE TABLE user_games (
    user_id INT,
    game_id INT,
    start TIMESTAMP NOT NULL,
    end TIMESTAMP
);

現在のゲームでは、endNULLに設定します。ユーザーが別のゲームに切り替えたら、end新しいゲームの新しい行を更新して追加します。

現在のゲームを照会するには、endNULLの条件でテーブルを結合するだけです。歴史的なゲームを照会するには、タイムスタンプがとの間にあることを確認してstartくださいend

于 2013-02-19T18:52:24.513 に答える
-1

おそらくGameHistoryテーブル

UserId | GameId 

1      | 563    

開始日と終了日はゲームテーブルに保存されると思います。現在のゲームIDをユーザーテーブルに保存したり、GameHistoryテーブルに現在のゲームと呼ばれるビットフィールドを作成したりすることもできます。

于 2013-02-19T18:45:10.020 に答える