マリオカートのER図について考える

:::note info
info
初めまして。assu_mingです。
人生初めての記事なのでお手柔らかにどうぞ！ *[Twitter:@assu_ming](https://twitter.com/assu_ming)
:::


さて、
今回はオフィスにて「**ER図とは**？」を学ぶランチを開催しました🍔
ゲームのDBなんて考えたことが無いので、ER図アウトプットに至るまでを記事に残してあげようと思います。

今回は、リリース時に同僚みんなで遊んでいたスマホゲーム「[マリオカート ツアー](https://mariokarttour.com/ja-JP)」を使って
**マリカーのフレンドランキング画面**を出すために必要なDB設計を考えます。
軽いランチなので、事前に参加者が通勤中の電車内で作成できるくらいのボリュームを目指しました。

データベースとは・・・？という初心者メンバーでもイメージしやすいように。
こういうアウトプットは初めてですが、徐々に慣れていきたいです。

---
**【開催概要】**
・参加者：ファッションIT企業のPM、エンジニア、事務・・・などなど
・開催時間：1時間（事前アウトプット作成：20〜30分程度）
・その後：SQLを初心者と書いてみるランチも実施しました。
　→[BigQueryがSQL初心者練習に丁度よかった話](https://qiita.com/assu_mz/items/4292ffc93a9395b0d557)

---

:::

🍄🍄🍄
#### ` 0.初めに 「ER図」とは `

`Entity Relationship Diagram`の略。

データベースのテーブル`Entity`と、テーブル同士の関連`Relationship`を図に表したもので
主にデータベースのテーブル設計の際に用いられています。
ER図を見るだけで**そのシステムが扱うデータ構造・関係性**がわかるという重要な図です。

#### ` 1.最終的に出したいイメージを考える `

まず、初心者向けに最終ゴールイメージを持ってもらうために
**どんなデータを取り出したいか**？ を考えます。
今回は既に結果画面があるので、この画面から出したいデータを箇条書きで取り出します。
<img width="200" alt="IMG_9993.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/61b17462-c6e6-e1ba-966d-01693c176812.png">
・順位
・フレンド名
・バッジ
・スコア
・ランキング残り時間

これくらい。完全は目指しませんのでざっとでOK
（上位、所持アイテム強すぎて勝てない）

#### ` 2.どんなデータが必要か列挙する `
難しいので手書きします。ペンで書いた方がどんどん出てくる。（個人的見解）
電車内ならスマホでとりあえずぽちぽち書き出すだけでも。
<img width="300" alt="9732C317-955A-4E52-ABB2-148CC268FEAC.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/23fc7ed1-3c01-9c61-d2d7-54690d05f19e.jpeg">

#### ` 3.時系列で並べる `

2と3の順番は逆でも良いかなと思います。
フローが長いほど、時系列に沿って考える方が楽。
並べて仕分けしているうちに「あ、あれも必要かも...」が出てきたら都度増やします。
<img width="480" alt="9DABA32A-C63B-415A-82E4-ED6D52469BD9.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/c05d22bf-ca71-3473-6ab9-610465f6e6fb.jpeg">


そして不要データを消す。赤入れをしました。
<img width="520" alt="B1F1F410-1DF1-432E-9043-2F712C75B897.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/c42a1a2b-b49d-7ff3-d7ca-148d0d3c8c1f.jpeg">


#### ` 4.データのかたまり毎に分類してみる `
今回は最後までペンでいきます✏️
この1かたまりをエンティティ(`Entity`)と呼びます。ER図のEですね。
今回細かく触れませんが、`Entity`の中身たちは属性（`Attribute`）と呼びます。
<img width="420" alt="7F63622E-61F3-44DE-B8AA-9B9B3D565F66.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/97095bc6-57f3-cd29-f175-fadc89ebe708.jpeg">



#### ` 5.エンティティ同士の関係性を線でつなぐ `
リレーション(`Relationship`)、ER図のR部分です。
**親子関係にあるテーブルは必ず繋ぐ。**
今回はランキング結果なので、ゴールに必要なエンティティだけ作ってるはず。
<img width="530" alt="13E36660-A510-44E1-95F6-9D54F418586D.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/01322180-9aca-a739-adac-b11480312319.jpeg">

すると、浮いてしまっているエンティティがありました。（真ん中、下段2つずつ）
繋げるというのは、**のちにSQLでクエリを書くときのJOIN**にあたります。
JOINするときは同じ意味を持つ項目同士をイコールで繋いだりするので、**共通のidをエンティティ間で持つ必要があります**。

とりあえず
何やら難しいですが、エンティティ同士を結びつける為にキーとなる項目が必要なんですね。
（じゃないとデータを正しく紐づけられなくなる）

**【対処法】**
***id*** を振って → 足りない項目を増やして → 線で再び繋ぎます。
最終的に一人ぼっちのエンティティが居なくなりました。
（例：「プレー結果」「フレンド」などにユーザーIDを追加）
<img width="580" alt="70BCB781-BA0D-44DE-99F6-E61423AEA7ED.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/bfc9bce7-acaa-b4ab-c96b-25f26f0fc573.jpeg">
それっぽくなりました！

このままだとごちゃごちゃしているので、ちゃんとしたツールで図にします。

〜〜〜　🍄ここからは余裕があったらやる🍄　〜〜〜
#### ` 6.それらしいカッコイイ項目名を付けてあげる（英語） `
○○idとか、▲▲nameとか。ノリでOK
日本語（論理名）のままでも分かりやすいですが、今回はBigQueryでクエリを書けるようになりたい！という人もいたので英語変換しました。
（→その後：[BigQueryがSQL初心者練習に丁度よかった話](https://qiita.com/assu_mz/items/4292ffc93a9395b0d557)）

#### ` 7.図に落とし込む `
ER図作成ツールや、その他ツールを使って見やすい綺麗な図にします。
今回たまたま見つけたこちらで作成しました → [WWW SQL Designer](https://ondras.zarovi.cz/sql/demo/?keyword=default)

⭕️：UIが可愛い。直感的。
❌：１対多を表す「鳥の足」マークが付けられない
（`PlantUML`を使った人もいました。おすすめのWEB上ツールがあれば知りたい）

線だけ引くなら手軽にできました。完成！！
<img width="912" alt="mario_er.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512375/8a04aadf-f3a3-5806-791a-99211db52185.png">
（1エンティティから線を複数出しているのは、いわゆる1対多の関係の「1」を意味します）


#### ` 8.感想 `
人によってアウトプットの中身が違っていて楽しかった！
初心者ならではの視点もたくさんあり、開催側としてもとても参考になりました。

・ランキング集計スコアについて
予め計算して持っておく案もありました。
フレンドが100人いた場合「都度3コースのスコア合計を計算する時間がかかるかも」という考え。
そうすると、ランキングページの読み込み速度の短縮と、ルビー配布時に使えると。
初心者でこの負荷を考えるのはすごいなーと思いました。
（わいわいランチ会なので不正解なんてないです。良いアイデア！）

フレンドが20人も居ないから思いつかなかったな！フレンド増やそう！！！


##### ` 追記 `
ER図ランチ🍔という気軽な会を提案してくださった社内の方々と
新卒で入った会社で1から教えてくれた方々へとても感謝するきっかけになりました。

最初にしてはちょっと難しかったかもしれないけれど。初ER図作り会楽しかった。
身近なサービスでなんとな〜くイメージして、意見を出し合うだけでも◎と思いました！

ちなみに：
UberEatsもみんなで注文ついでに考えたりもしました。美味しくて楽しいからやってみてね🍔


ご覧いただきありがとうございました。

★参加者の次のステップ記録はこちら。
　→[BigQueryがSQL初心者練習に丁度よかった話](https://qiita.com/assu_mz/items/4292ffc93a9395b0d557)