この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
この無料分で引けなかったら諦める
ガチャから派生させてボックスガチャを作る事になりました
ぷらんなー「このゲーム、普通のガチャはあるけどさ、ボックスガチャやりたいから作って」
さーばーえんじにあ「ボックスガチャか」
ぷらんなー「必要な機能は大まかに言うと、
・ボックスガチャを引く
・現在のボックスの中身を確認
・各ステージでのボックスの中身の確認
・ボックスガチャのリセット
ね。リセット回数はガチャを定義する親マスタで制限かけるから。
細々とした仕様は後で仕様書が完成したら共有するけど、取り敢えず確定事項です」
さーばーえんじにあ「りょーかい」
ボックスガチャってなぁに?
例えるならば、ガチャポンです。
中身が有限なガチャです。
排出率が1%のレアキャラが出るガチャだったら、通常は100回引いても大体63%の確率でしか引けませんが、ボックスガチャならば中身が有限なので、中身を全て引けば100%出す事が出来ます。
やったね!!
ガチャから派生させてボックスガチャを実装するにはどういうAPIとどういう追加データが必要だろう
さーばーえんじにあ「必要なAPIとしては、まあ、必要な機能の通りで、
・ボックスガチャを引く
・現在のボックスの中身を確認
・各ステージでのボックスの中身の確認
・ボックスガチャのリセット
で大丈夫だよな」
さーばーえんじにあ「で、サーバー側で持つべきデータとしてはまず、
・ユーザーのボックスの現在状態
が必要だよな。で、えっと? 機能に 各ステージでのボックスの中身の確認
なんて項目があるって事は、リセットする度にボックスの中身変わるのかな?」
ぷらんな「そうだよ。仕様書もうそろそろ出来るから、ちょっと待ってて」
さーばーえんじにあ「あ、はい。なら、
・ステージ毎のボックスの中身を定義するマスタ
を別に作った方がいいか。通常のガチャの中身を定義するマスタとは段々かけ離れてくるし。
……その位か」
必要な機能:
・ボックスガチャを引く
・現在のボックスの中身を確認
・各ステージでのボックスの中身の確認
・ボックスガチャのリセット
必要な追加データ:
・ユーザーのボックスの現在状態
・ステージ毎のボックスの中身を定義するマスタ
さーばーえんじにあ「で、ユーザーのボックスの現在状態をどうやって保存するかちょっと悩むな。二つ案あるんだけど」
案1:
中身のコンテンツ一種類毎にレコードを作る
利点:
・構造が簡単。ユーザー動向の調査の為の検索や緊急対応の為の一括更新などがし易い。
欠点:
・ユーザー一人辺りのデータが多くなる。総レコード数は簡単に考えて、(ユーザー数×ボックスガチャの数×ボックスガチャの平均コンテンツ種別量)となる
・10連でガチャったりする場合、SQLの更新回数が多い(O(n))
案2:
ボックスガチャ一つに対し、データをJSONなどで一括管理。
利点:
・ユーザー一人辺りのデータが少ない。総レコード数は簡単に考えて(ユーザー数×ボックスガチャの数)となる。
・10連だろうと1連だろうとSQLの更新回数は1回(O(1))
欠点:
・ユーザー動向の為の調査の為などの検索、緊急対応の為の一括更新がし辛い。JSONを生で保存するならlike検索などは辛うじて出来るが、圧縮してバイナリなどにした場合、全く出来なくなる
・管理、更新の為に毎回JSONなどを展開、圧縮などする必要がある為、やや面倒
さーばーえんじにあ「……1だな! 2の欠点が、結構でかいからなぁ。ユーザー動向の調査とかはともかく、何か緊急対応しなきゃいけなくなった時、一括更新とか出来なくてユーザー一人一人に対して処理掛ける必要が出てきて、時間が酷く掛かったりとか、そんないやーな予感がする。
データベース容量は結構余裕あるし、古いボックスガチャのデータとか、引き切ったボックスのデータとかはパーティション区切れば一括削除出来るし、ユーザー単位でそんな数百件もデータ保持しないだろ!
それに、更新の為の計算量はO(n)だけど、最大10連とかだったら、1回での更新は最大10回だし、ちゃんとインデックス張れば大丈夫でしょ!
……まあ、設計書とかちゃんと作るとして」
テーブル概要書
マスタデータ
┣キャラクターマスタ CharacterMaster
┃┣キャラスキルマスタ CharacterSkillMaster
┃┣キャラ成長マスタ CharacterExpMaster
┃┃┗キャラパラメータマスタ CharacterParameterMaster
┃...
...
┣ガチャの親マスタ GachaMaster
┃┣ガチャの中身マスタ GachaContentMaster
┃┗ボックスガチャの中身マスタ <= new!
...
ユーザーデータ
┣所持キャラクター群 Characters
...
┣現在のボックスガチャの状態データ群 <= new!
...