Network Gameのデータベース

Menu

Network Game の例
プレイヤー 所持金 所持アイテム 性別 装備 性格 レベル 攻撃力 防御力
マイケル 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 armor

update 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 を持てるようにしたい

複製による複数 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');

必要なデータだけを書く item
プレイヤー 所持金 所持アイテム 性別 装備 性格 レベル 攻撃力 防御力
ローズ 1100 回復薬 女 盾 臆病 15 48 38
ローズ 剣
剣を削除する場合は良いが、盾を削除すると、1100などの情報が失われてしまう。(deletion anomarly)


複数itemの表現

    プレイヤーと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
Big table に一緒に入れる必要はない。ここだけ別な表にすると、空白が減る。

宝箱
宝箱 中身 お金
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');

Shinji KONO / Tue Oct 25 09:03:57 2011