2

PHPを使用して書いているゲームがあります。私の質問の目的のために、私のゲームを iPhone の「Words with Friends」と比較できます。このゲームに慣れていない人のために、これはオンライン/モバイルのスクラブル ゲームです。ゲームは 3 つの主要なステップで構成されます。

  • 最初の 2 人のユーザーがゲームを開始することを決定します。
  • 2番目に、2人のユーザーのゲームデータを保持するデータベーステーブル「DATA」内に新しい行が作成されます。
  • 3 つ目、そして最後に、2 人はゲームをプレイする新しいページに移動します。ゲームオーバーになると「DATA」テーブルの行が削除され、勝敗が保存されて「USER」テーブルに反映されます。Words with Friends と同様に、ユーザーはいつでも複数の「オープン ゲーム」を持つことができます。つまり、別のゲームを開始する前に、あるゲームを終了する必要はありません。

背景: MySQL データベースには、少なくとも 2 つのテーブルがあり、1 つは一般的なプレーヤー データ用で、1 つは USER というラベルが付けられ、もう 1 つは現在進行中のゲームの統計を保持するための DATA と呼ばれます。各ユーザーには、アカウントを作成するときに一意の 9 桁の ID プライマリ キーが与えられます。

このようなことを達成するために使用されるベスト プラクティスについてアドバイスが必要です。私の意見ではかなり原始的なアイデアがいくつかありましたが、それらは機能しますが、より専門的なものを使用したいと考えています.

私のアイデアの 1 つは、2 つのユーザー ID のうち小さい方の ID を大きい方の ID の先頭に連結し、それをデータベースに保存することでした。例。adam と alan の 2 人のユーザーがいます。それらの ID は123456789223456789それぞれ および です。GAMEIDこれら 2 つは、が に等しいDATA テーブルに新しい行を作成するゲームを開始し123456789223456789ます。彼らはゲームの途中でプレイし、サインアウトします。翌日、彼らは新しいゲームを始めようとします。データベースは、どのユーザーが小さい ID を持っているかを確認し、それらを連結して、ゲームの記録が既に存在するかどうかを確認します。ゲームがすでに開始されていることに気づき、123456789223456789まったく新しいゲームを作成する代わりに、すでに進行中のゲームに戻します。

これは確かにやり過ぎであり、この問題を回避するもっと簡単な方法があるはずです。感謝し、提案やヒントをお願いします。

4

1 に答える 1

2

user_gamesゲームとユーザーを関連付ける単純なテーブルで十分です。アクティブのフラグまたは最終アクティブの日時を追加することもできます。

CREATE TABLE user_games (
  user_id INT NOT NULL,
  game_id INT NOT NULL,
  UNIQUE KEY index_user_games_on_user_game (user_id, game_id),
  KEY index_user_games_on_game (game_id)
);

適切にインデックス付けできないキーを作成して、これを過度に複雑にしないでください。インデックスは、テーブルがクエリ不能な混乱になるのを防ぐものです。このテーブルをクエリしuser_idて、ゲームのリストを検索しgame_idたり、ゲーム内のユーザーを検索したり、ユーザーがゲームに参加しているかどうかを確認したりできます。

于 2012-08-21T06:07:52.283 に答える