- ベストアンサー
この正規化アドバイス願います【初心者】
【アイテムテーブル】id | 名前 装備Lv 物理攻撃 魔法攻撃 特殊効果 【職業テーブル】job_id | 名前 【入手方法テーブル】map_id | マップ名 NPC名 【分類テーブル】 kind_id | 名前 【関連テーブル】id(外) job_id(外) map_id(外) kind_id(外) ※|の左が主キーです。 となってるんですが、1つのアイテムに特殊効果は複数付与される場合があります MP回復速度+2、MaxHP+20 MaxMP+10、魔法命中率+1%・・・ なので【アイテムテーブル】に特殊効果1 特殊効果2 特殊効果3としてしまうと正規化されません。。 この様な場合はどのように対処すればいいのでしょうか? というか、上のテーブルは正規化されてますよね? どなたかご教授願います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
どのみち、特殊効果の種類は限られているでしょうし、MP回復速度+1とMP回復速度+2のどちらが優れているかという比較をしたくなるのが目に見えてますので、 特殊効果マスター tokusyu_id | 名前 アイテム特殊効果テーブル item_id tokusyu_id | 効果程度 効果程度は、後の比較のことを考えると、数値での保存がベターかと思われます。その場合、単位は無視することになりますが、どのみちMP回復速度+2%とMP回復速度+2(無単位)なんて、複数の単位を持つ特殊効果はないでしょうから、問題はないでしょう。表示の時のことを考えるなら、特殊効果マスターに、単位というフィールドを追加しておいても良いかもしれません。 後、気になるのは、入手方法テーブルの扱いです。 これ、多分、アイテムにのみ属する属性のように思えます。(例えば、戦士用のナイフというアイテムは、**草原で、魔法使い用のナイフというアイテムは**山脈で拾う・・・・なんて、こんなのなしですよね?) とすると、入手方法テーブルは、入手方法マスターに名前を変更して、 入手方法テーブル item_id(外) map_id(外) [全フィールドで主キーを構成] として、関連テーブルからは、map_idを外した方が良いと思います。 また、分類テーブルも、同じく、アイテムのみに属する属性でしょう。さらに言えば、 同じアイテムが、武器と防具の二つの種別に分類されるということは、あり得ないと考えると、 アイテムテーブル id | 名前 装備Lv 物理攻撃 魔法攻撃 分類 としておいても良いかと思います。そして、関連テーブルから、kind_idを外します。 万が一、同じアイテムが複数の分類に属する場合があるとしたら、これは別テーブルで関連表を作ります。 アイテム分類表 item_id kind_id [主キーは全フィールドで構成] こうすれば、あいまいだった関連テーブルのテーブルの名前がはっきりします。これは、装備可能職種テーブルです。 装備可能職種テーブル item_id job_id 最後に、もう一度全部まとめると、 【アイテムテーブル】item_id | 名前 装備Lv 物理攻撃 魔法攻撃 kind_id(外) 【職業テーブル】job_id | 名前 【入手方法マスター】map_id | マップ名 NPC名 【アイテム入手方法テーブル】 item_id(外) map_id(外) [全フィールドで主キーを構成] 【分類テーブル】 kind_id | 名前 【特殊効果マスター】tokusyu_id | 名前 【アイテム特殊効果テーブル】item_id(外) tokusyu_id(外) | 効果程度 【装備可能職種テーブル】item_id(外) job_id(外) [主キーは全フィールドで構成] この類の作業で、「関連テーブル」のように、具体的な名前がつけられないテーブルができた時は、おそらくきっと、何かが間違っています。なぜ名前が曖昧になるのかを考えると、意外と大きなヒントになりますよ。
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
読み取れる範囲で。。 そこはおそらく特殊効果の種類が複数のアイテムで共用できるかによって変わります。 特殊効果の内容が各アイテム固有であれば、 【アイテム特殊効果テーブル】 ・id(外) effect_id | 特殊効果 (effect_idはid内連番) ・effect_id | id(外) 特殊効果 のいずれかです。 特殊効果の内容が複数のアイテムで共用できるような内容ならば、 【特殊効果テーブル】 effect_id | 特殊効果 【アイテム特殊効果テーブル】 id(外) | effect_id(外) となります。 ちなみに、内容を見る限りはメインで管理するのはアイテムでしょうから、普通は関連テーブルは作らないで、 【アイテムテーブル】 id | 名前 装備lv 物理攻撃 魔法攻撃 job_id(外) map_id(外) kind_id(外) とすると思います。
お礼
ありがとうございます。 希望通りできました。 またよろしくおねがいします