DB(MySQL)とGolangのつなぎ込みを構築する

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は以下の形で実装する。

Users

id:bigint/insert index
uid:string/firebase jwt -> ‘sub’
created:datetime/insert date
updated:datetime/update date

UserInfos

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

UserItems

id:bigint/insert index
user_id:bigint/tbl_user:id
item_id:int/get item id
deleted:int/delete flag 0

UserPresentBoxs

id:bigint/insert index
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

DzSv

maintenance:int/0

ShopSale

id:bigint/insert index
startDate:datetime/start date
endDate:datetime/end date

以下はゲームメインとは関係ないので別Databaseに入れ込む。

errorLog

id:uint/insert index
userId:uint
os:int/(pc(0)/ios(1)/android(2)/other(3))
log:string/stack trace
created:datetime/insert date

これとは別に、テーブルは存在する。
固定テーブルというやつだ。

メンテ入れるかわからないけど期間入れて更新できるようにしたい。

アイテムテーブルを用意してクライアントに送りつけたい

Items

item_id:int/get item id
icon_name:string
name:string
desc:string

ショップを用意したい(販売物はitemのもの)

Shops

id:bigint/insert index
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

gormは丁寧なドキュメントが用意されている。

English

日本語(多分英語版のほうが最新)

gorm.Model を定義すると以下のものが定義される。
`ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`

また、”ID”という名前はプライマリーキーに自動で指定されるようだ。
もし変えたい場合は`gorm:”primary_key”`を指定すればいい。

データベースの設計はゲーム性によって大きく変わるので
やりたいことをやりたいユーザ数捌けるのであればどれも正解だと思う。
その中でも最速を目指したいが、その優先度は低い。

まずは作りきらなければ。出来なかったらたとえ0.9でも0であり出来上がったら1なのだ。

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください