MySQLとGolangのつなぎ込み
MySQLはRDBMSだ。
テーブル構築はGUIで出来る(MySQLWorkbench)。
今回はローカルに構築するが、
CloudDatabaseでもMySQLベースのものがあるのでそちらに任せればいいだろう。
実装で問題になるのは、以下二点だ。
・Golang <-> MySQL のつなぎ込み
・Transaction処理の厳格化
GolangとMySQLのつなぎ込みに関しては、SQLから取得したデータを
Golangの形式のデータに変えないといけない点。
これはORM(Object-Relational-Mapping)というものがあるらしいのでそちらを使用したい。
また、gormなどはマイグレーション機能もあり、テーブルの作成や削除をgo側ですることも可能なようだ。
Transaction処理の厳格化については、ロールバックも含めて考えた作りにできているか。
例えば課金で課金石(+おまけアイテム)の購入をした際には、
・課金ログのInsert
・ユーザの課金石の追加
・更におまけのアイテムInsert
が行われることになるが、これらを一つのトランザクションで管理したい、となると
BeginTransactionとEndTransactionで囲むことになる。
一つのトランザクションのなか途中でエラーが起きたらすべての処理をしないようにロールバックしないといけない。
また、エラーを正常処理として返してしまうと課金レシートをユーザ側で削除する恐れもあるため
きっちり異常終了であることを送信しつつ正常処理できるまで再送してもらうようにしないと課金ロスト、などの事象に至ってしまう。
とても神経を使う部分だが、しっかりルールを決めて実装すれば難しいことではない。
というわけでフレンドとかも無いしユーザの情報を格納するDBは以下の形で実装する。
id:bigint/insert index
uid:string/firebase jwt -> ‘sub’
created:datetime/insert date
updated:datetime/update date
userId:bigint/tbl_user:id
userName:string/username
maxScore:int/score
coinR:int/RedCoin
coinG:int/GreenCoin
coinB:int/BlueCoin
coinY:int/YellowCoin
coinP:int/PurpleCoin
iosGem:int/ios purchase add gem
andGem:int/android purchase add gem
iosFreeGem:int/ios free add gem
andFreeGem:int/android free add gem
created:datetime/insert date
updated:datetime/update date
id:bigint/insert index id:bigint/insert index maintenance:int/0 id:bigint/insert index 以下はゲームメインとは関係ないので別Databaseに入れ込む。 id:uint/insert index これとは別に、テーブルは存在する。 メンテ入れるかわからないけど期間入れて更新できるようにしたい。 アイテムテーブルを用意してクライアントに送りつけたい item_id:int/get item id ショップを用意したい(販売物はitemのもの) id:bigint/insert index gormは丁寧なドキュメントが用意されている。 English 日本語(多分英語版のほうが最新) gorm.Model を定義すると以下のものが定義される。 また、”ID”という名前はプライマリーキーに自動で指定されるようだ。 データベースの設計はゲーム性によって大きく変わるので まずは作りきらなければ。出来なかったらたとえ0.9でも0であり出来上がったら1なのだ。
user_id:bigint/tbl_user:id
item_id:int/get item id
deleted:int/delete flag 0
user_id:bigint/tbl_user:id
item_type:int/ ios_gem/and_gem/ios_free_gem/and_free_gem/coin_r/coin_r/coin_g/coin_b/coin_y/coin_p/item
item_id:int/get item id
count:int/get item count
del:int/delete flag 0
startDate:datetime/start date
endDate:datetime/end date
userId:uint
os:int/(pc(0)/ios(1)/android(2)/other(3))
log:string/stack trace
created:datetime/insert date
固定テーブルというやつだ。
icon_name:string
name:string
desc:string
itemType:int/ ios_gem/and_gem/ios_free_gem/and_free_gem/coin_r/coin_r/coin_g/coin_b/coin_y/coin_p/item
itemId:int/get item id
count:int/get item count
payItemType:int/ ios_gem/and_gem/ios_free_gem/and_free_gem/coin_r/coin_r/coin_g/coin_b/coin_y/coin_p/item
payItemId:int/get item id
payCount:int/get item count
name:string
desc:string
http://doc.gorm.io
`ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`
もし変えたい場合は`gorm:”primary_key”`を指定すればいい。
やりたいことをやりたいユーザ数捌けるのであればどれも正解だと思う。
その中でも最速を目指したいが、その優先度は低い。