Network Gameのデータベース
Menu Menu
プレイヤー | 所持金 | 所持アイテム | 性別 | 装備 | 性格 | レベル | 攻撃力 | 防御力 | |
マイケル | 3000 | パソコン | 男 | ナイフ | 知的 | 10 | 30 | 22 | |
ジャック | 2500 | スマートフォン | 男 | 剣 | 勇敢 | 9 | 25 | 11 | |
ボブ | 4200 | 食料 | 男 | ライフル | 大雑把 | 20 | 60 | 47 | |
メアリー | 1500 | チョコレート | 女 | 魔法の杖 | おっとり | 13 | 32 | 50 | |
エミリー | 4200 | 車 | 女 | ショットガン | 冷徹 | 31 | 84 | 3 | |
ローズ | 1100 | 回復薬 | 女 | 盾 | 臆病 | 15 | 48 | 38 | |
アラン | 100 | なし | 男 | 木棒 | ぶっきら棒 | 2 | 5 | 3 | |
アニー | 6900 | 松明 | 女 | 火炎銃 | 冷静 | 58 | 124 | 53 | |
ベン | 4300 | カメラ | 男 | バズーカー | 荒い | 49 | 100 | 76 | |
キャリー | 7500 | トローンボーン | 女 | トランペット | 気高い | 74 | 159 | 38 | |
装備を調べる
select equipment from game where player = 'Michael';
鎧を着る
wear armorupdate armor from game where player = 'Jack';
ゲームでのデータベース処理の特徴
プレイヤーや宝箱を特定して、その対象の値を変更することが多い。
プレイヤーを決めると、その所持金が決まる○○を決めると××が決まると言う関係を、関数従属性 (Functional Dependency) と言う。
○○は当然、キーであることが望ましい。
Character の移動
update game set position = 'Tokyo' where player = 'Jack';
攻撃力の計算
レベルと武器で攻撃力が決まるとする
プレイヤーが決まると、レベルと武器が決まる レベルと武器が決まると、攻撃力が決まる一つのテーブルに、○○が決まると△△が決まる、△△が決まると××が決まるというように次々に決まる関数従属性がある時に推移従属性があると言う。
item の購入
購入は money と item の両方を修正する必要がある。update game set money = money-5000 where player = 'Jack';update game set item = "two handed sword" where player = 'Jack';
複数の item を持てるようにしたい
プレイヤー | 所持金 | 所持アイテム | 性別 | 装備 | 性格 | レベル | 攻撃力 | 防御力 | |
ローズ | 1100 | 回復薬 | 女 | 盾 | 臆病 | 15 | 48 | 38 | |
ローズ | 1100 | 回復薬 | 女 | 剣 | 臆病 | 15 | 48 | 38 | |
全部を正確にコピーする必要がある。間違えるとデータが変になる。
, で区切って複数のものをいれる
select item from game where player = 'Jack';
$value = "'two handed sword", $value"; update game set item = '$value' where player = 'Jack';
欠損データを使う
update game set money = money-5000 where player = 'Jack';insert into game ( player, item) values ('Jack', 'two handed sword');
プレイヤー | 所持金 | 所持アイテム | 性別 | 装備 | 性格 | レベル | 攻撃力 | 防御力 | |
ローズ | 1100 | 回復薬 | 女 | 盾 | 臆病 | 15 | 48 | 38 | |
ローズ | 剣 | ||||||||
複数itemの表現
プレイヤーとitemを決めると、その個数が決まると考える。
プレイヤー | 所持アイテム | 個数 | |
ローズ | two handed sword | 100 | |
ローズ | chain mail | 1 | |
アラン | wood stick | 1 | |
アニー | chain mail | 2 | |
ユーザ登録
select user_name from game where user_name = 'Jack'; if ( no such user ... ) { insert into game ( user_name, password ) values ('Jack', 'hogehoge' ); } else { .... }登録前にユーザが重複しているかどうかを調べる必要がある。(データベースの制約)
複数アイテムを重複するレコードで表すと、ユーザが重複しているのかアイテムが複数あるのかを区別できない。
ユーザをキーにすると、insert で重複を検出することもできる。
宝箱の取得
Big Table で宝箱をどう表現するか?
update game set item_box1 ='none' insert into game ( player, item) values ('Jack', 'two handed sword');
プレイヤー | 所持金 | 所持アイテム | 性別 | 装備 | 性格 | レベル | 攻撃力 | 防御力 | 宝箱 | 中身 | お金 | |
1 | two_handed_sword | |||||||||||
2 | money | 500 | ||||||||||
宝箱 | 中身 | お金 |
1 | two_handed_sword | |
2 | money | 500 |
select contents from game where item_box_id = 1; update game set contents ='none' where item_box_id = 1; insert into game ( player, item) values ('Jack', 'two handed sword');