ガチャから派生させてボックスガチャを作る事になりました
ぷらんなー「このゲーム、普通のガチャはあるけどさ、ボックスガチャやりたいから作って」
さーばーえんじにあ「ボックスガチャか」
ぷらんなー「必要な機能は大まかに言うと、
・ボックスガチャを引く
・現在のボックスの中身を確認
・各ステージでのボックスの中身の確認
・ボックスガチャのリセット
ね。リセット回数はガチャを定義する親マスタで制限かけるから。
細々とした仕様は後で仕様書が完成したら共有するけど、取り敢えず確定事項です」
さーばーえんじにあ「りょーかい」
ボックスガチャってなぁに?
例えるならば、ガチャポンです。
中身が有限なガチャです。
排出率が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! ...