• ベストアンサー

この正規化アドバイス願います【初心者】

【アイテムテーブル】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としてしまうと正規化されません。。 この様な場合はどのように対処すればいいのでしょうか? というか、上のテーブルは正規化されてますよね? どなたかご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.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)
回答No.1

読み取れる範囲で。。 そこはおそらく特殊効果の種類が複数のアイテムで共用できるかによって変わります。 特殊効果の内容が各アイテム固有であれば、 【アイテム特殊効果テーブル】 ・id(外) effect_id | 特殊効果  (effect_idはid内連番) ・effect_id | id(外) 特殊効果 のいずれかです。 特殊効果の内容が複数のアイテムで共用できるような内容ならば、 【特殊効果テーブル】 effect_id | 特殊効果 【アイテム特殊効果テーブル】 id(外) | effect_id(外) となります。 ちなみに、内容を見る限りはメインで管理するのはアイテムでしょうから、普通は関連テーブルは作らないで、 【アイテムテーブル】 id | 名前 装備lv 物理攻撃 魔法攻撃 job_id(外) map_id(外) kind_id(外) とすると思います。

noname#184273
質問者

お礼

ありがとうございます。 希望通りできました。 またよろしくおねがいします

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • FFXI初心者です。

    「はじめてのファイナルファンタジー」を入手し先ほどはじめたばかりなんです。MAPがひろすぎてどこに行けばいいのかもわかりません。やっと外に出て戦闘になったらすぐにしんでしまいました。説明書も最低限のことしか書いてないですしもうちょっと初心者にわかりやすいガイド的なホームページがもしあったら教えてください。 後、最初にえらぶジョブは何がやりやすいのでしょうか?魔法使いがすきなんですが、始めてばかりで友達もいないので一人だと戦闘もつらいのかなと思ったり・・・・。 オススメなのがありましたら教えていただけるとうれしいです。

  • 正規化の仕方がわからず困ってます!助けて下さい。

    授業のレポートで郷土料理のデータベースを作っています。正規化をしてみたのですが、合っているのが分かりません。 本を見ながら自分なりに下のようにやってみました。 (1)非正規形 (材料、道具、行事名は複数あるため、材料ID、道具ID、行事ID以下それぞれ繰り返し) 料理ID・料理分類ID・料理分類名・料理名・料理名注解・調理方法・情報源・食べ方・料理に関する情報源・地域・写真の有無・補足情報・材料ID・材料名・旬の時期・栄養価・材料の入手方法(現在)・材料の入手方法(昭和中期~後期)・材料の入手方法(明治~昭和初期)・道具ID・道具名・行事ID・行事名・行事名注解・行事内容・地域・行事に関する情報源 (2)第一正規形 繰り返しをしている部分を分割しました。 ■料理テーブル 料理ID・料理分類ID・料理分類名・料理名・料理名注解・調理方法・どのような時に食べるか・料理に関する情報源・地域・写真の有無・補足情報 ■材料テーブル 料理ID・材料ID・材料名・旬の時期・栄養価・材料の入手方法(現在)・材料の入手方法(昭和中期~後期)・材料の入手方法(明治~昭和初期) ■道具テーブル 料理ID・道具ID・道具名 ■行事テーブル 料理ID・行事ID・行事名・行事名注解・行事内容・地域・行事に関する情報源 (3)第二正規形 部分キーにのみ従属するフィールドを分離しました。 ■材料_材料関連テーブル 料理ID・材料ID ■材料詳細テーブル 材料ID・材料名・旬の時期・栄養価・材料の入手方法(現在)・材料の入手方法(昭和中期~後期)・材料の入手方法(明治~昭和初期) ■道具_料理関連テーブル 料理ID・道具ID ■道具名テーブル 道具ID・道具名 ■行事_料理関連テーブル 料理ID・行事ID ■行事詳細テーブル 行事ID・行事名・行事名注解・行事内容・地域・行事に関する情報源 (4)第三正規形 主キー以外のフィールドに従属するフィールを分離しました。 ■料理テーブル 料理ID・料理分類ID・料理名ID・調理方法・どのような時に食べるか・情報源・地域・写真の有無・補足情報 ■料理分類テーブル 料理分類ID・料理分類名 ■料理名テーブル *ここで料理名IDを付けました。 料理名ID・料理名・料理名注解 ■行事詳細テーブル 行事ID・行事名ID・行事内容・地域・情報源 ■行事名テーブル 行事名ID・行事名・行事名注解 *ここで行事名IDを付けました。 これで合っているのでしょか??全く自信が無いです。 どう考えても料理テーブルがごちゃごちゃしています。 どのように整理したらよいか教えてください。よろしくお願いします。

  • データベースと正規化とINSERT文について

    ただいま以下の一つのテーブルを正規化しようとしています。 テーブル:英単語 フィールド:単語、意味1、意味2、意味3、品詞、分類1、分類2、分類3、例文、難易度、ID(主キー・オートインクリメント) これを以下のように分けました。(分類とは単語の分類です。例えば year なら意味は 年 で分類は 時間 とか 単位 とか属性を入れたいのです。) ****** テーブル:英単語 フィールド:単語、意味1、意味2、意味3、分類ID、分類ID、分類ID、例文ID、難易度、ID(主キー・オートインクリメント) テーブル:分類 フィールド:分類名、ID(オートインクリメント 主キー) テーブル:品詞 フィールド:品詞名、ID(オートインクリメント 主キー) テーブル:例文 フィールド:例文、ID(オートインクリメント 主キー) ****** (1)これで正規化できているでしょうか? もしできていないなら、どうすればよいでしょうか? (2)また、仮にこのままデータベースを作るとすると、INSERTの時に英単語テーブルの分類IDに、分類テーブルのIDをひもづけるにはどうしたら良いのでしょうか? INSERT INTO 分類 (分類名) VALUES("時間") のあと、オートインクリメントされたIDを取り出して、英単語テーブルに入れるにはどうしたらいいでしょうか。

    • ベストアンサー
    • MySQL
  • 2つのテーブルにあるIDを1つのID(item_id)?にしたいです。

    2つのテーブルにあるIDを1つのID(item_id)?にしたいです。 このやり方は間違ってますか? ご指摘よろしくお願いします。 車テーブル car_id name  maker price 1   スープラ トヨタ 100 2   スカイライン 日産 100 食べ物テーブル food_id name price 1 リンゴ 100 2   バナナ 100 アイテムテーブル item_id car_id(外) food_id(外) 1 1 NULL 2 2 NULL 3 NULL 1 4 NULL 2

  • 第3正規化について

    第3正規化について いつもお世話になっております。 第3正規化についての質問なのですが、理解できないので質問させて頂きます。 "t_携帯"というテーブルがあり、 [社員CD](一意) [氏名] [性別] [台数CD] [製造番号](一意) [メーカー名] [型名] [記憶媒体] [認証ID](一意?) [PASS] というフィールドがそれぞれ存在し、 [台数CD]フィールドの扱いがよく理解できなくて困っています。 例えばAさんが携帯を1台所持している場合、Aさんは[台数CD]フィールド'1'を持ち、 2台所持しているBさんは'1'と'2'を持ち、2台目以降の携帯情報が繰り返しとなるので 第1正規化するのは分かるのですが、それ以降の第3正規化までの手順と マスタ分けがよく分かりません。 ご教授の程、宜しくお願いします。

  • 同一テーブルの同一フィールドで複数条件指定

    例を挙げます。 テーブルA 「member」 | ID | 名前 | テーブルB 「item」 | ID | 名前 | テーブルC 「item_check」 | member.ID | item.ID | というテーブルがあります。 テーブルAはメンバーで一人一つのデータが入っています。 テーブルBはメンバーが持つであろうアイテムのマスタです。 テーブルCはメンバーがどのアイテムを持っているかを示しているテーブルです。 テーブルCに関しては同じメンバーでも複数のアイテムを持つこともあるので複数のデータが入る場合もあります。 で、やろうとしているのは、 「アイテムA と アイテムBを持っているメンバー」 という検索を行いたいのです。 同じテーブル上ならば select * from member where item1 = "A" and item2 = 'B' ... ; と、いくつでも条件が指定可能なのですが、 同じテーブルの同じフィールドを同じメンバーで複数条件指定して検索することはできるのでしょうか。 私が考えたのは一回ではできないで、 まずは一つの条件を出して while でループさせて条件を付け足してやるような効率が悪そうなものです。 (少ない件数ならばいいのですが、数千~数万件の検索になりそうなので手軽にできればと思いまして・・・) アイテムは不特定なので、1個から数十個とかの検索もありえます。 何かいい手はないでしょうか。

    • ベストアンサー
    • MySQL
  • ACCESS テーブルの正規化

    EXCELデータで以下のような正規化されていない項目のデータをACCESSに取り込んで顧客毎に商品の数量を計算するクエリを使用しています。 顧客ID|顧客名|商品名1|商品名2| ・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・・ XXXXX ○○○       2      3  ・・・・・・・・ 商品名が可変で追加されたり、削除されたりするのですが、今までは集計の都度クエリを作成していたため問題はありませんでしたが、今回クエリからレポートとフォームを作成するように指示がありました。自分が集計の都度クエリを作成出来ない環境になったため、事前にクエリを組んでフォーム、レポートを作っておきたいのですが、可変な項目名の集計クエリを作成する方法はあるでしょうか? 私のイメージでは 顧客ID|顧客名|商品名 数量 XXXXX ○○○  商品1  2 XXXXX ○○○  商品2  1 XXXXX ○○○  商品3  3 このように正規化出来ればよいと思います。 ACCESSにはテーブルの正規化機能がありますが、操作方法を読んでみるとやはり事前に項目を指定して作成するように読み取れました(間違っているかもしれませんが) 何か良い方法があれば教えてください。 EXCELのVBAは多少書けるのですが、ACCESS VBAはあまり得意ではありません。 自分でメンテナンス出来るように、出来ればクエリで作成したいのですが無理でしょうか? よろしくお願いします。

  • テーブルの正規化について

    現在一つのテーブル(ゲーム仕入れ在庫管理)に全てまとめている状態で管理がしづらく 正規化をしてみようと思いネットで調べながらやっているのですが うまくいきません・・・。 フィールドは ID(オート) JANCODE メーカー 商品名 状態(新品・中古) 商品型番 対応本体 定価 売価 仕入れ値 仕入れ先 販売本数 入荷数 残数 入荷日 という感じで一つにまとまっています。 なにかアドバイスいただけるとうれしいです。

  • COUNTについて

    今2つのテーブル(table1には商品IDと商品名、table2にはレシートIDと商品ID)を用い、 table1にある商品がtable2に何回登場しているかCOUNTを用いて数えたいのですが、 1回も登場しない商品が結果に表示されなくて困っています。 以下の様なテーブルを用いています。 [table1] 項目:item_id(主キー)|name 0|"item0" 1|"item1" 2|"item2" [table2] 項目:detail_id(主キー)|item_id(外部キー) 0|0 1|0 2|1 このとき、 SELECT table1.name,COUNT(*) FROM table1,table2 WHERE table1.item_id = table2.item_id GROUP BY table1.name; のようなSQL文だと、結果にitem2が含まれず、 item0とitem1の登場回数だけ表示されてしまいます。 これをitem2は0回登場していることがわかるように出力したいのですが、 どうしたらいいでしょうか。

    • ベストアンサー
    • MySQL
  • filemaker pro9 初心者です

    FileMaker pro9 評価版を使って売上管理表を作っています。 超初心者なのでよろしくお願いします。 顧客ごとにIDを設定し、そのIDから 名前、住所 等が自動的に呼び出されるようにしたいのですが、 リレーションが上手く出来てないためか一部呼び出されません マスターに使用しているテーブル:「顧客マスター」 フィールドは 【顧客ID】【顧客名】【〒】【住所】です そして新たに「売上テーブル」を作りました フィールドは 【顧客コード】【お客さん名】【ラベル用〒】【ラベル用住所】です I 売上のあった顧客のみ住所を表示してラベルに印刷したいのでここに住所も出るようにしたいんですが、 名前だけちゃんと呼び出されてあとの分が呼び出されません。 リレーション一覧:(「」はテーブル【】はフィールド →はリレーションです) 「売上テーブル」【顧客コード】→「顧客マスター」【顧客ID】 「売上テーブル」【お客さん名】→「顧客マスター2」【顧客名】(リレーションを作るときに自動的に2が作成されました 以下同) 「売上テーブル」【ラベル用〒】→「顧客マスター3」【〒】 「売上テーブル」【ラベル用住所】→「顧客マスター4」【住所】 となっています。 そして、【顧客コード】【お客さん名】【ラベル用〒】【ラベル用住所】には計算式が入っており、それぞれ Lookup (顧客情報マスター2::顧客名;0) Lookup (顧客情報マスター3::〒;0) Lookup (顧客情報マスター4::住所;0) となっております。 実は最初にお客さん名のみ作りそのときはうまく自動的に入力されたのですが、続いて〒、住所とやってみましたが全くでなく、0の値が出てしまいます。 オプション等は全く同じです。どこが間違っているのでしょうか? ヘルプを見てもわからず、ネットであれこれ検索してみても、質問レベルが低すぎるためか全く出てきません よろしくお願いします。