こんにちは!ちゃんみおです。 まだまだ自分の職種がまぶしいですね。

さて、今回は初投稿と比べたらちょっとためになりそうな内容を目指します。 テーマは【お問い合わせ対応を意識したDBカラムについて考えてみる】です。

前提条件

  • 案件はwebアプリ
  • 開発にはphp・MySQL・symfonyフレームワークを使用

結論的なもの

  • ユーザーがゲーム上で何らかの報酬を獲得した場合、「いつ」「何」を「どのくらい」獲得したのかを記録
  • 「何」は、必ず特定できるものにする

ゲーム上の処理の流れ

例えば「このボス倒したのに何ももらってない!」といったお問い合わせがあったりします。 そこで確認する必要があるのは主に以下の点かと思われます。

  • そのボスを倒したのかどうか
  • (倒したという事が確定した場合)何時倒したのか
  • 倒した場合、設定している報酬がユーザーに付与されているのか
  • 報酬の設定は正しいか
  • (付与されていた場合)「いつ」「どのくらい」付与されているのか

そもそもボスを倒したという事が確定できなかった場合は、遭遇したのかどうか、アクセスログ、エラーログなどを見る必要がありますが…

ユーザーがお問い合わせをしてきた場合に備え、特定の結果を記録するため、ログ用のテーブルをDB上に用意します。

  1. ボスとの遭遇の有無
  2. ボスとの遭遇状況
  3. ボスとの対戦結果

ユーザーの一連の動作に対し、3種類のテーブルを用意しました。

例として、それぞれ以下のような名前があるとします(テーブル名はあくまで例です)。

続きを読む

1.) ボスとの遭遇の有無

  • member_target_encounter_log

→「いつ」「どのボス」と遭遇したのかを記録するログ

2.) ボスとの遭遇状況

  • member_target

→「いつ」「どのボス」と「どうした(している)」のかを記録するログ

3.) ボスとの対戦結果

  • member_target_battle_log

→「いつ」「どのボス」と対戦し、「どうなった(勝敗の結果)」、勝った場合は「何」を「どのくらい」獲得したのかを記録するログ

「どのボス」や「どの報酬」に関しては、以下のテーブルで設定されているものとします。

・【master_target】→ボスの情報

・【master_target_bonus】→ボスのIDに紐づいた、撃破時にユーザーが得られる報酬

 

◆◆◆テーブル名にプレフィックスを付けて分かりやすくする◆◆◆

実際に案件に関わっていて学ばせていただいたのですが、テーブル名はプレフィックスを付けることで何のテーブルなのかより分かりやすくなります。 例えば

  • ユーザーの行動によってデータが挿入されるテーブル名…プレフィックスに「member_」
  • こちら(運営)側で設定するテーブル……プレフィックスに「master_」

各テーブルのカラム定義

1.) 【member_target_encounter_log】

  • id …(ID)
  • member_id …(ユーザーを特定するためのカラム)
  • target_id …(どのボスかを特定するためのカラム)
  • created_at …(「いつ」を特定するためのカラム)

・もし、そのターゲットとは1度しか遭遇しないのであれば、idは不要

・そのかわり、member_idとtarget_idに対しユニークインデックスを設定

・お問い合わせ時、member_idで検索することがあるはずなのでインデックスを設定

2.) 【member_target】

※遭遇中のボスは必ず1体のみとした場合

  • id …(ID)
  • member_id …(ユーザーを特定するためのカラム)
  • target_id …(どのボスかを特定するためのカラム)
  • target_status …(そのボスとの遭遇状況、または勝敗(0:遭遇中、1:勝ち、2:負け))
  • created_at …(「いつ」を特定するためのカラム)
  • updated_at …(更新日時。データが更新された場合に書き換わるカラム)

・member_idにインデックスを設定し、id降順で取得

・target_statusはデフォルトが0、対戦した場合にはその結果をセットし、更新

3.) 【member_target_battle_log】

  • id …(ID)
  • member_id …(ユーザーを特定するためのカラム)
  • target_id …(どのボスかを特定するためのカラム)
  • battle_status …(対戦の勝敗結果を記録するためのカラム(1:勝ち、2:負け))
  • bonus_id …(「何」を獲得したのかを特定するためのカラム)
  • created_at …(「いつ」を特定するためのカラム)

・member_idやmember_id、target_idにインデックスを設定

・bonus_idには、【master_target_bonus】テーブルのidをセットするようにする

※master_で始まるテーブルは省略します。

最後に

特定の動作の際、かならず漏れが無いように値をセットする必要がある、というのは言うまでもないですが、このようにログ用のテーブルがあるとお問い合わせが来た時に証拠等を提示し易くて便利です。

あわせて読みたい記事