【第3回】モンスター育成ゲーム用APIをPythonのFastAPIで作ってみたい…けど大丈夫かな?

「本ページはプロモーションが含まれています」

こんにちは。前回はMermaidを使って、「モンスターを手に入れる」フローのシーケンス図を描きました。

kunio-ud-zatta.hatenablog.com

少しだけ全体像が見えてきた気もしますが、今度はデータベース(DB)の設計をやらないといけません。

「DB設計」はゲームでいう基盤みたいなものなので、いざやろうとすると「これで本当に大丈夫?」と不安になります。ただ、とにかくやってみよう!ということで今回はER図を描いて、SQLiteにテーブルを作ってみるところまでを目指します。

1. ざっくり考えるテーブル構成

今回のモンスター育成ゲームAPIでは、大きく分けて以下のようなテーブルを想定しています。

  1. users: ユーザー情報(例: ユーザーID、名前、など)
  2. monsters: ゲーム内で登場するモンスターの種(例: モンスター名、レア度、ステータス基本値 など)
  3. user_monsters: 各ユーザーが所有しているモンスター個体(例: ユーザーID、モンスターID、レベル、経験値 など)

さらに拡張するなら:

  • battle_logs: バトル履歴を残す
  • items: アイテム管理(回復薬や進化石など)
  • user_items: ユーザーごとのアイテム所有状況

…など

最初は最低限の3テーブルで、ゲームの「所有」部分が動けばOKかな、という方針です。 もちろん本格的に作るなら認証用テーブルやリレーションが増えていくので、後々拡張していくイメージです。

2. MermaidでER図を描いてみる

2.1 ER図サンプル

Mermaidを使うと、以下のようにテキストベースでER図を描けます。

erDiagram

    USERS ||--o{ USER_MONSTERS : "owns"
    MONSTERS ||--o{ USER_MONSTERS : "instances of"

    USERS {
        int id PK
        string username
        datetime created_at
    }

    MONSTERS {
        int id PK
        string name
        string rarity
        int base_hp
        int base_attack
        int base_defense
    }

    USER_MONSTERS {
        int id PK
        int user_id FK
        int monster_id FK
        int level
        int exp
        datetime obtained_at
    }
erDiagram

    USERS ||--o{ USER_MONSTERS : "owns"
    MONSTERS ||--o{ USER_MONSTERS : "instances of"

    USERS {
        int id PK
        string username
        datetime created_at
    }

    MONSTERS {
        int id PK
        string name
        string rarity
        int base_hp
        int base_attack
        int base_defense
    }

    USER_MONSTERS {
        int id PK
        int user_id FK
        int monster_id FK
        int level
        int exp
        datetime obtained_at
    }

2.2 解説

  • erDiagram: MermaidでER図を書く際の基本宣言
  • USERS ||--o{ USER_MONSTERS : "owns":
  • ||--o{ は「1対多」の関係を意味し、「USERS 1 : n USER_MONSTERS」を表現。
  • : "owns" はリレーションの説明コメント(読みやすさ向上用)
  • テーブル定義ブロックでカラムと型を定義
  • PKはPrimary Key、FKはForeign Keyを示すだけで、Mermaid上はビジュアル的に分かりやすくなるという感じ。
  • USER_MONSTERSテーブルには user_id と monster_id が外部キーとして入る想定です。

Mermaid Live Editorなどで上記コードをプレビューすると、ER図として表示されます。 本来、ER図には「レア度はenum型を使うか?」とか細かい仕様も盛り込みたいけど、とりあえず最初は大まかに定義しておく程度でOKかな…と思ってます。

3. SQLiteにテーブルを作成してみる

3.1 簡単なDDLの例

FastAPIの実装時にORM(SQLAlchemyなど)を使う予定なら、ORMを通じてテーブルを作るのが主流かもしれません。 ただ、今回はまず素のSQLでもテーブルを作れるよ、ということを確認してみます。(最近DynamoDBばかりだったので、実は素のSQLは忘れているのですが…練習がてら書いてみます!)

SQLLiteは以下でWindowsのToolsをダウンロードしました。

www.sqlite.org

sqlite3.exeのフォルダに行き、ファイルを作成します。

sqlite3 fastapi_monster.sqlite3

-- users テーブル
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- monsters テーブル
CREATE TABLE IF NOT EXISTS monsters (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    rarity TEXT,
    base_hp INTEGER DEFAULT 10,
    base_attack INTEGER DEFAULT 5,
    base_defense INTEGER DEFAULT 5
);

-- user_monsters テーブル
CREATE TABLE IF NOT EXISTS user_monsters (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    monster_id INTEGER NOT NULL,
    level INTEGER DEFAULT 1,
    exp INTEGER DEFAULT 0,
    obtained_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (monster_id) REFERENCES monsters(id)
);

SQLiteの管理ツールやCLIでこれを実行すると、3つのテーブルが作成されるはず。

確認コマンド

.table

3.2 実際にデータを入れてみる

試しにmonstersテーブルに何かデータを挿入しておくと、後々API実装したときに便利です。

INSERT INTO monsters (name, rarity, base_hp, base_attack, base_defense)
  VALUES ('Slime', 'common', 10, 5, 5);

INSERT INTO monsters (name, rarity, base_hp, base_attack, base_defense)
  VALUES ('Dragon', 'rare', 100, 20, 15);

「Slime」や「Dragon」など、ゲームっぽい名前をテストデータとして入れてみましょう。 ここを「ピカチュウ」とか「リザードン」などにすると著作権的にアレなので、自作っぽい名前に。。。

4. これで本当に十分なのか…?

正直、ゲーム要素を作り込むなら、もっと多くのテーブルを分ける必要があるはず。 • 例: ユーザーのログイン情報、アイテムテーブル、バトルの履歴、モンスター進化条件 など。 今回の例は、最低限の部分をまず形にしただけです。 「今後の拡張を見越して設計をどうするか」 は悩みどころですが、やってみないと分からない部分も大きいので、とにかく動かしてみて改善…の流れでいきたいと思います。

あまり、DB設計書があるゲーム開発は聞きませんが、あると、自分が倒れた時など、引継ぎやすいですよね。

テーブル一覧、DESCで見る!

というツワモノもいるでしょう。が、私のような図を並べて全体のDB構成がわかると嬉しいやからもいるのです。。。

5. 次回:FastAPIの環境構築&フォルダ構成

ER図とDDLができたので、いよいよFastAPIで実際のAPIをつくる準備に入りたいです。

  • 仮想環境の作り方
  • ディレクトリ構成案(app/main.py とか routers/ とか)
  • ORM(SQLAlchemy)を導入するかどうか

…などを整理してみる予定ですが、また「これで大丈夫?」と自問自答しつつ進めることになりそう。 がんばります。

6. まとめ

  • MermaidのER図でテーブル間のリレーションを可視化すると、DB構造がイメージしやすくなる
  • SQLiteでまずは簡単にテーブルを作ってみた(素のSQL、あるいはORMでもOK)
  • 今後はFastAPIとの連携やORMの導入など、実際にAPIが動く段階に進む予定
  • ゲーム要素を足すたびにテーブル定義は増えそうなので、こまめにER図を更新していきたい

DB設計は奥が深いのでまだまだ不安は尽きませんが、いったんこの段階で実装を進めていこうと思います。もし「こうした方が使いやすいよ!」とか「もっとこういうテーブルが必要なんじゃ?」というアイデアがあれば、ぜひ教えてください!

いやぁ、こういう調査を沖縄県宮古島市で調べて書きたい。。