データベースの正規化について

このQ&Aのポイント
  • データベースの正規化についての質問です。第一正規化、第二正規化、第三正規化の手順を経て、テーブルがどのように変化していくかについて教えてください。
  • 質問者は受注情報のデータベースを正規化する作業を行っていますが、模範解答と自分の結果が異なることに疑問を持っています。どこで間違っているのか、間違えている場合の理由を教えてください。
  • 質問者は第一正規化、第二正規化、第三正規化の手順に従ってテーブルを分解していますが、最終的には商品コード、商品名、販売単価のテーブルに受注情報が収納されています。この結果で合っているのか、それとも他のテーブルが必要なのかについて教えてください。
回答を見る
  • ベストアンサー

データベースの正規化について質問です><

データベースの正規化について質問です><教えて下さい。 伝票を正規化していく問題なのですが、 受注番号 受注日 得意先コード 得意先名 得意先住所 {商品コード 商品名 販売単価 受注数量 受注金額} {}は繰り返しを表します。 これをまず自分で第一正規化してみて//*は主キーを表す。 *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 受注数量 受注金額 になり次に第二正規化してみて *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 *受注番号 *商品コード 受注数量 受注金額 になり最後に第三正規化をして *受注番号 受注日 得意先コード *得意先コード 得意先名 得意先住所 *商品コード 商品名 *商品名 販売単価 //ココです。 *受注番号 *商品コード 受注数量 受注金額 となったのですが模範解答には//ココです。の部分がなく、*商品コード 商品名 販売単価 これのままで終わっていました。 自分が間違えているのでしょうか??もし間違えているなら理由を教えて下さい。長くてすいません

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

実務レベルと、学習レベルだと模範になるモデルはかわってきます。 今回は学習レベルということでよろしいですか? 実務レベルではご提示のようなデータの持ち方はありません →受注番号 受注日 得意先コード 得意先名 得意先住所 {商品コード 商品名 販売単価 受注数量 受注金額} (1)受注番号をプライマリとして処理するかどうか 通例、受注番号はユニークですが、特定の受注を修正する必要が出た場合 履歴の問題から受注番号を新たに振りなおす必要がでてきます。 それはビジネス的にはナンセンスなので、プライマリーなIDを別途もたせるか 枝番をつけるかのどちらかになります。 (2)得意先コードと得意先名、得意先住所は学習レベルでは正規化すべき項目ですが 実務レベルでは正規化できません。 つまり得意先の名前や住所は普遍性がなく、変わる可能性が高いからです。 逆に名前や住所がかわるたびに得意先コードを振りなおすケースもありますが そうすると集計性がそこなわれます。場合によってはこれも枝番を発行したりする ケースになるかもしれません。 (3)同様に商品コードは受注番号にひもづくとして、商品名は普遍性があると みて正規化することができるかもしれません、販売単価と受注数量は受注番号 に依存するものなので正規化対象ではないでしょう。 近年の傾向から消費税も変動的なものなので、税金も受注番号ごとに持たせる 必要がでてくると思います。 (実際は期日と税テーブルで対応は可能ですが集計を簡素化するためには有効) 受注金額も集計のため持たせるのが実務的ですが、計算結果なので学習レベルでは もたせる必要はありません。 (4)販売単価についてもマスター化できますが、ビジネスにおいては販売単価は ころころ変わります。当然実務レベルでは個別にもつのが常識で、学習レベルでは 商品マスターに埋め込めるかもしれません。 あわせて粗利なども個別受注ごとに持たせた方が集計はしやすくなります。 総じて・・・きっちりやるなら [販売データテーブル] *オリジナルID 受注番号 受注日 作成日 更新日 得意先コード 得意先名(受注時) 得意先住所(受注時) 商品コード 販売単価 受注数量 受注金額税抜 税額 受注金額税込 削除フラグ [得意先テーブル] *得意先コード 得意先名 得意先住所 注)結局名前と住所は二重でもつことになる [商品テーブル] *商品コード 商品名 となり、ざっくりとするなら [販売データテーブル] *受注番号 受注日 得意先コード 商品コード 受注数量 [得意先テーブル] *得意先コード 得意先名 得意先住所 [商品テーブル] *商品コード 商品名 販売単価 みたいな持ち方になるでしょうか・・・

u_f_o_pech
質問者

お礼

詳しい解説ありがとうござます。 納得できました。

その他の回答 (2)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

> 自分が間違えているのでしょうか? > もし間違えているなら理由を教えて下さい。 間違っています。 「*商品コード 商品名 販売単価」という表の各項目の関数従属の矢印は, 「ある商品コードに対して,商品名は一意に決まる」 「ある商品コードに対して,販売単価は一意に決まる」 の2つです。この表には推移関数従属が含まれていませんから,第三正規形への変形過程はありません。 部分関数従属性を排除する第二正規形の例 http://itpro.nikkeibp.co.jp/article/lecture/20061128/255079/?SS=imgview&FD=7256014 推移関数従属性を排除した第三正規形の例 http://itpro.nikkeibp.co.jp/article/lecture/20061128/255079/?SS=imgview&FD=9103056

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

商品名はユニークとは限らないので、キーにするのはおかしいです。 あるいは、ご自分でも、そこをわけてるのに、 *得意先コード 得意先名 *得意先名 得意先住所 にしなかった理由を考えればわかるのでは?

関連するQ&A

  • 正規化について

    どなたか教えてください。 新入社員です。 現在研修中です。研修の課題なのですがわかりません。 内容は次のとおりです。 次の受注伝票を第三正規化までしましょう。 項目:受注番号、日付、顧客番号、顧客名、住所、業種コード、業種名、受注総金額、商品コード、商品名、単価、受注数量 なんとか週末までにできれば解説つきで解答していただける方お願いできますか? あるいは同じ項目の受注伝票の正規化を紹介しているサイトなどご存知の方教えてください。

  • 第3正規形について

    平成27年秋期の基本情報技術者試験の問27 関係“注文記録”の属性間(1)~(6)の関数従属性があり,それに基づいて第3正規形まで正規化を行って, “商品”,“顧客”,“注文”,“注文明細”の各関係に分解した。関係“注文明細”として, 適切なものはどれか。ここで,{ X ,Y } は,属性 X と Y の組みを表し, X → Y は,X が Y を関数的に決定することを表す。また,実線の下線は主キーを表す。 注文記録(注文番号,注文日,顧客番号,顧客名,商品番号,商品名, 数量,販売単価) 〔関数従属性〕 (1) 注文番号 → 注文日                (2) 注文番号 → 顧客番号 (3) 顧客番号 → 顧客日                (4) {注文番号,商品番号} → 数量 (5) {注文番号,商品番号} → 販売単価      (6) 商品番号 → 商品名 ア 注文明細(注文番号,数量,販売単価) イ 注文明細(注文番号,顧客番号,数量,販売単価) ウ 注文明細(注文番号,顧客番号,商品番号,顧客名,数量,販売単価) エ 注文明細(注文番号,商品番号,数量,販売単価) 答えはエです。自分なりの解釈してみました。 ア:注文番号からわかるのは(1)、(2)より、注文日と顧客番号である。数量も販売単価も注文番号と商品番号の2つないとわからないので誤答。 イ:アと同じ理由 ウ:よくわかりません。。。 エ:商品番号と顧客番号から分かるのは数量と販売単価だから エがどうして」答えになるのかまたア~ウはどうして違うのか。 わかりやすく教えてください。

  • オラクルのビューについて

    (顧客テーブル) 項目名 顧客コード、顧客名、顧客名カナ (商品テーブル) 項目名 商品コード、商品名、受注単価 (受注テーブル) 項目名 受注番号、顧客コード、受注年月日、納入予定年月日 (受注明細テーブル) 項目名 受注番号、商品コード、受注数量 を使って次のビューを作ります。 (商品別受注日計データ) 項目名  商品コード 商品名 受注単価 受注年月日 日計商品別受注数量  受注数量(受注明細テーブル)の合計 日計商品別受注金額  受注単価*日計商品別受注数量 このときに日計商品別受注金額を求めるには先に日計商品別受注数量を求めておかなければなりませんが、これを一つのSELECT文で行う事は可能でしょうか。 そのまま一つのSELECT文でやろうとするとGROUP BYでうまくいかないのですが、 やはり先に日計商品別受注数量を求めておかなければいけないのですか? どっちにしろやり方がわかりません。

  • EXCELで入力用シートをまとめる

    Excelで10名が同じ書式の入力用シートを各自別々にファイルで持ち、 使っています。 それを、別のシートで一つの表にまとめる方法があれば、どうぞ教えてください。 できれば、まとめたシートは当日分と毎日のデータを溜めていけるものを 作りたいと思っています。 統合やってみたのですが、単価、受注数量、得意先codeが合計数量で 出てしまいます。 例いとうSHEET1 種類 商品CODE 単価 受注数量 得意先CODE ああ ABCDEF  100    125        3440 例すずきSHEET1 種類 商品CODE 単価 受注数量 得意先CODE いい GHIJKLMN  500     99        3330 これを、下記のようにまとめたいのです。 例合計SHEET1 種類 商品CODE 単価 受注数量 得意先CODE ああ ABCDEF  100     125        3440 いい GHIJKLMN  500     99        3330

  • 条件抽出された1フィールドの複数レコードを複数フィールドの1レコードとして表示するには?

    Accessで商品販売のデータベースを作っています。 商品マスターテーブルには、「商品名」「略称」「単価」「単位」・・・が入っており、 販売記録フォームに日付ごとで売上を入力するようになっています。 (サブフォーム(データシートビュー)に、商品を入力し、価格を表示します) ------------------ [得意先名] ------------------ [日付] ------------------ [商品名][数量][単位][単価][金額]  ・  ・  ・  ・ ----------------- これとは別に、売上一覧表を作成しようと思います。 これは、日付ごとに略称で商品名を表示し、一目で何が売れたか分かりやすくするものです。 ------------------------------ [得意先名] ------------------------------ [日付][略称1][略称2][略称3][略称4][略称5][略称6]・・・ ------------------------------ 1つの得意先で、1日の商品項目が10を超えることはありません。 どうしてもできないので、何かいい方法があれば教えてください。

  • CSVファイルからEXCELへのインポート

    下記の項目のCSVファイルをEXCELにインポートしようと思っております。 得意先コード、得意先名(漢字)、商品コード、商品名、売上数量、売上金額 このCSVファイルをEXCELにインポートする際、得意先ごとに別のシートにしたい(シート名は得意先名としたい)場合どのようにすればよいのか、アドバイスいただければと思っております。 宜しくお願い致します。

  • Accessでクエリを作った際の順番

    Access2003の質問です。 以下のテーブルがあってそれらの項目を抜き出してクエリを作っています。 テーブル1 ・商品CD ・商品名 ・単価 テーブル2 ・No ・売上日 ・得意先CD ・商品CD ・数量 テーブル3 ・得意先CD ・得意先名 ・フリガナ ・郵便番号 ・住所 ・TEL ・担当者CD ・DM テーブル4 ・担当者CD ・担当者名 クエリ ・No(テーブル2) ・売上日(テーブル2) ・得意先CD(テーブル2) ・得意先名(テーブル3) ・担当者CD(テーブル3) ・担当者名(テーブル4) ・商品CD(テーブル2) ・商品名(テーブル1) ・単価(テーブル1) ・数量(テーブル2) クエリを作って、データシートビューに切り替えるとなぜか得意先CDで昇順に並んでいます。 もちろんNoで並べ替えを設定すれば、Noで並べ替わるのですが、なぜ得意先CDで昇順に並ぶのでしょうか? Noが一番左にあるので、Noで並べ替わりそうなものですが・・ 何も並べ替えを設定しないとどのような基準で並ぶのでしょうか? わかる方がいれば教えてください。

  • Accessでの集計に関して

    昨日、商品券の集計に関して質問させて頂きまして 商品券A 商品券B 商品券C 商品券D 商品券E と5種類ありそれぞれに商品券コード1~5をふり 大分類としてA~Cの商品券にコード1 商品券Dにコード2 商品券Eにコード3 をふれば場合に応じた集計が可能であるとアドバイスを頂きまいたが もう1つ掘り下げまして 商品券をお客様から受領する際には 1種類の商品券ではなく場合によって2~3種類を 一度に頂くことがあります。 そのためデータベースに入力する際に 1画面のフォームで2~3種類の商品券を一度に入力するには どのように設定すれば宜しいでしょうか。 現在のテーブルの設定は以下のとおり 商品マスター→商品券コード・商品券名・単価 得意先マスター→得意先コード・得意先名 受領テーブル→日付・受領日・得意先コード・商品券コード        数量 受領クエリ→日付・受領日・得意先コード・得意先名・商品券コード       商品券名・数量・単価・金額(数量×単価) レポートで受領書を発行し得意先へ渡す(期間は1か月) ※商品券は大分類での表示となります。 商品券の枚数管理は1か月単位で受領日ごと小分類の商品券で 行います。 検索は月ごと、得意先ごとでできればと。 以上 お手数ですがよろしくお願いします。    

  • 集計結果を別テーブルに更新クエリで書き出したい。

    Access2000を使っています。 テーブルとフィールドの関係は次のようになっています。 (一部、Northwind.mdbを使っています。) 受注 ---------------------- 得意先コード 受注コード 受注明細 ---------------------- 受注コード 単価 数量 売上集計 ---------------------- 得意先コード 合計 受注明細テーブルの単価と数量を掛け合わせたものの合計を 売上集計テーブルの合計に書き出したいと思います。 次の選択クエリの合計の値を売上集計テーブルの取引先コード の一致する場所に書き出したいのです。 SELECT 受注.得意先コード, Sum([単価]*[数量]) AS 合計 FROM 受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード GROUP BY 受注.得意先コード; 売上集計テーブルと受注テーブルの得意先コードは同じものが 存在します。 よろしくお願いします。

  • また正規形について。

    http://www.techscore.com/tech/sql/16_02.html のURLの下の方の表 受注番号、商品番号、納入業者 12345  001   業者 A 12345  002   業者 B 12346  001   業者 A 12347  001   業者 D において、 ****以下引用**** このとき、非主キー列「納入業者」は「受注番号」と「商品番号」から決まりますので、(受注番号、商品番号) →納入業者は関数従属の関係が成立しています。よって、このテーブルは第二正規形の条件を満たしていると言えます。(中略) ****引用終わり**** とありますが、私には 商品番号→納入業者 という関数従属関係があるきがするのですが違うのでしょうか?なので第二正規形の時点で、 (商品番号、納入業者)という表が新たに分離される気がするのですが… さらに、 http://www.st.rim.or.jp/~ryoma/tips/seikika.htm のURLの同じくボイスコッド正規形で扱われ表、 商品コード、仕入先コード、担当者コード 000120001 111 401 000120001 112 402 000120002 111 401 000120002 150 403 仕入先コード、仕入先名 001 東京商店 002 大阪商会 003 名古屋流通 で、 *引用* 商品コード、仕入先コード、担当者コードを属性とする上の表は、繰り返し部分を持たず、また商品コード+仕入先コード、あるいは商品コード+担当者コードをキーとすることができ、かつ推移従属の関係が存在しないため、第三正規形です。 *終* とありますが、主キーを【商品コード、仕入先コード】と決めたとき、非候補キーである担当者コードは仕入先コードに関数従属している気が(私は)してしまうので第二正規形へ変形した時点で(仕入先コード、担当者コード)という表が分離されていると思うのですが。 以上の解釈で間違っている考えがあればご指摘ください。

    • ベストアンサー
    • MySQL