ShinnosukeSuzuki / techtrain-mission-ca-tech-dojo-golang

オンライン版 CA Tech Dojo サーバサイド (Go)編
0 stars 0 forks source link

step5: ガチャに関連するテーブルの設計 #2

Closed ShinnosukeSuzuki closed 3 weeks ago

ShinnosukeSuzuki commented 1 month ago

step5: ガチャに関連するテーブルの設計

APIの要件

全てのAPIの仕様についてはapi-document.yamlに記載。step5に関連するAPIを下記に記載。

ガチャ関連API

POST /gacha/draw ガチャを引いてキャラクターを取得する処理を実装します。 獲得したキャラクターはユーザ所持キャラクターテーブルへ保存します。 同じ種類のキャラクターでもユーザは複数所持することができます。 キャラクターの確率は等倍ではなく、任意に変更できる。 Request

{
  "times": 0
}

Response

{
  "results": [
    {
      "characterID": "string",
      "name": "string"
    }
  ]
}

キャラクター関連API

GET /character/list ユーザが所持しているキャラクター一覧情報を取得します。 Response

{
  "characters": [
    {
      "userCharacterID": "string",
      "characterID": "string",
      "name": "string"
    }
  ]
}

ER図

erDiagram
    users ||--o{ results : has
    characters ||--o{ results : has

    users {
        int id PK "AUTO_INCREMENT"
        varchar(255) name "NOT NULL"
        varchar(255) token "NOT NULL UNIQUE"
    }

    characters {
        int id PK "AUTO_INCREMENT"
        varchar(255) name "NOT NULL"
        float probability "NOT NULL"
    }

    results {
        int id PK "AUTO_INCREMENT"
        int user_id FK "NOT NULL"
        int character_id FK "NOT NULL"
    }

テーブル設計で考えたこと

usersテーブル

ユーザー情報を保存するテーブル。 tokenを元にユーザーを一意に決定することができるため、ユニーク制約をつけた。

charactersテーブル

キャラクターの不変的な内容(IDや名前など)を定義する情報テーブル。 排出確率をprobabilityとした。

resultsテーブル

ガチャの結果を保存するテーブル。 ユーザーは同じキャラクターを複数所持できることからユーザーとキャラクターはN:Nの関係なので、usersとcharactersの中間テーブルとなるようにusersのidとcharactersのidを外部キーとした。

相談したいこと

ShinnosukeSuzuki commented 3 weeks ago

各テーブルのidをvacherでUUIDで作成するようにする。 プロダクションではauto incrementを採用しないことが多い。auto increment機能のないDBに移行する可能性もあるため。

ShinnosukeSuzuki commented 3 weeks ago

results→ users_charactersにテーブル名を変更する。

ShinnosukeSuzuki commented 3 weeks ago

アドバンスではキャラクターテーブルをメモリに乗せるなどがある。 ガチャの排出ロジックは本筋では何ので、シンプルでいい。

ShinnosukeSuzuki commented 3 weeks ago

キャラクター関連APIから優先して作る。 DBにサンプルを入れて動作確認。

ShinnosukeSuzuki commented 3 weeks ago

各テーブルのidをVARCHARに変更し以下のER図のように設計した。

erDiagram
    USERS ||--o{ USERS_CHARACTERS : has
    CHARACTERS ||--o{ USERS_CHARACTERS : "is owned by"

    USERS {
        string id PK
        string name
        string token
    }

    CHARACTERS {
        string id PK
        string name
        float probability
    }

    USERS_CHARACTERS {
        string id PK
        string user_id FK
        string character_id FK
    }
ShinnosukeSuzuki commented 3 weeks ago

https://github.com/ShinnosukeSuzuki/techtrain-mission-ca-tech-dojo-golang/pull/2/commits/c44451454fb71b86e17317071432a41d3aa8b466 userのidをuuidで作成するように修正した。 正常にユーザー作成apiが動作することを確認した。