• 締切済み

データ正規化について

【質問内容】 自分で途中までやったんですが、(2)の第2正規形からわからなくなったので、どなたかデータベースに詳しい人のアドバイスをいただけたらなと思います。あと、間違いがあればご指摘願います。 【問題内容】 (1) 職種歴表(非正規形)をバッカス表記法で記述。 (2) (1)についてデータ正規化を第3正規形まで行い、その過程をバッカス表記法で記述。 (4) 正規化後の各表について、基本キー(連結キーの場合,その表     記)、外部キーを示す。 (5) このデータベースのデータ定義をSQL - DDL で記述。 【職種歴表】 従業員番号 従業員名 入社年月日 部門コード 部門名   職種コード   職種名     経験年数 S880123  鈴木太郎 04/01/88   A01    開発1課    P01    初級プログラマ    2                         P02                   中級プログラマ    3                         S01                   初級SE         1 T910354  佐藤花子 04/01/91   B01   電算1課    O01     初級オペレータ   2                         P01                    初級プログラマ    1 S860555  高橋一雄 04/01/86   A02   開発2課     S01     初級SE        3                         S02                    中級SE        5 (2) 職種歴表 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 +   {職種コード + 職種名 + 経験年数} (3) 【第1正規形】 職種歴表A = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表B = 従業員番号 + 職種コード + 職種名 +経験年数 【第2正規形】 職種歴表A = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表B = 従業員番号 + 職種コード + 職種名 +経験年数 職種歴表B2 = 職種コード + 職種名

みんなの回答

回答No.2

#1 です。 少し勘違いがありましたので、修正します。 【第2正規形】 {従業員番号,職種コード}→{経験年数} の関係と、{職種コード}→{職種名} の関係を分割する必要がありますので 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表 = 従業員番号 + 職種コード + 経験年数 職種 = 職種コード + 職種名 第三正規形は結果的には先に書いたもので正しいと思います。

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

職種コードの一部が部門コードの位置へずれているので、少し悩みました。 とりあえず、正規形についてかきます。 【第1正規形】 繰り返しの項目を無くせば良く、表の空欄に適当な値がすべて入れば良いでしょう。 表の分割の必要は必ずしもありません。 あえて分割すると、この場合には、下の第二正規形と同じになります。 【第2正規形】 部分関数従属を無くす。 例 {従業員番号,経験年数}→{職種コード} の関係がある一方で {従業員番号}→{従業員名}の関係があります。 {従業員番号}は{従業員番号,経験年数}の一部分なので、こういう物を無くす必要があります。 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表 = 従業員番号 + 職種コード + 職種名 + 経験年数 【第3正規形】 推移的関数従属を無くす。 例 {従業員番号}→{部門コード}→{部門名} の様に連続的に関数従属している形を無くします。 {従業員番号}→{部門コード}, {部門コード}→{部門名} となるように分割します。 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード 職種歴表 = 従業員番号 + 職種コード + 経験年数 部門 = 部門コード + 部門名 職種 = 職種コード + 職種名 こういう感じになるのでは無いかと思います。 ※バッカス表記法はよく知らないので適当にかきました。

hamasaki--
質問者

お礼

ご回答ありがとうございます。 バッカス表記法は、 職種歴表 = 従業員番号 + 従業員名 +       {職種コード + 職種名 + 経験年数} というような表現の仕方と習いました。 この正規化をもとにして、SQL-DDLを書いてみたいと思います。 本当にありがとうございました。

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

関連するQ&A

  • 概念データモデル

    少し抽象的な質問になるのですが、以下のテーブルがあったとします。 聞きたいことを絞るため全テーブルは記載していません。 ※[]主キー 店舗([店舗番号],店舗名,住所) 店舗構成部門([店舗番号],[部門コード]) 勤務時間帯([店舗番号],[勤務コード],勤務開始時刻,勤務終了時刻,休憩時間,実労働時間) 部門勤務時間帯([店舗番号],[部門コード],[勤務コード]) 部門最少人数([店舗番号],[部門コード],[勤務コード],[曜日コード],最少人数) 休憩申請([店舗番号],[従業員番号],[年月日]) ・・・・・・・・・・・・・・・・・・・・・ このようなテーブル構成の時、店舗テーブル以外の表に関して、店舗番号がわかれば、店舗テーブルは一意に決まります。よってリレーションとして、店舗テーブルから店舗テーブル以外のテーブルに対して、→(矢印)のマークが記載されることとなりますか??(矢印の先が多関係)

  • また正規形について。

    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
  • 正規化

    問題 次の履修テーブルを第三正規化しろ。 ひだりから、学生番号、学生名、科目番号、科目名、科目区分、単位、教員番号、教員名、成績。そして僕の見解は 第1が、「履修テーブル」・・・成績コード、学生コード、科目コード、教員コード、単位「科目マスタ」・・・科目番号、科目名、科目区分、単位「教員マスタ」・・・教員番号、教員名 あっているのか分からないですし、ここから分からないのですが教えていただけないでしょうか? よろしくお願いします。

  • 正規化について

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

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

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

  • 既存の表にデータを追加したい

    先日も 質問し、回答頂きました。いろいろアレンジしましたが、思うとおり出来ませんでした。 回答頂いたい方にメールを送る事出来ませんので再度 質問します。 既存の表 名前を検索し22年度列に番号、検査年月日を追加。 23年度は23年の列に番号、検査年月日を追加し履歴がわかるようにしたい。 また 新規であれば 21年度欄を 空欄にし 22年度欄に番号、検査年月日書き加える。 新規であれば 生年月日の 入力をどのようにすればよいか? 既存の表の一番上に表示し 直接生年月日を入力するような事が出来ますか? 入力欄     氏   名     22年度番号      検 査 年 月 日     アオ ミツヨ      22-1           H22.4.2 表 番号  氏     名  生 年 月 日  21年度番号 検 査 年 月 日  22年度番号 検 査 年 月 日  1    アオ トオル  S10.12.16    21-452     H22.1.19      2    アオ ミツヨ   S14.7.2     21-451      H22.1.19     22-1     H22.4.2   3    アオキ カヨ  S12.5.11     21-393     H21.12.17      4    アオキ フミ  S8.7.1       21-443     H22.1.15      5    アガタ エツミ S18.1.16     21-501     H22.1.27       6    新規 氏名 どのように入力? 空欄       空欄       22-500     H22.5.7   新規の方は生年月日も入力したいと思います。表に直接入力でも構いませんが、入力するカーソルに簡単に移動させる方法はありますか? 新規の方は表の最上段に表示させる方法とかありますか?      

  • ドロップダウンリストボックスの連動

    WEB系システムで、2つのドロップダウンリストボックスを以下の様に連動させたいです。 例えば以下のようなデータがあるとします。 部門コード100 部門名:営業部  課コード600 課名:対建築業界担当課 部門コード100 部門名:営業部  課コード700 課名:対小売業界担当課 部門コード200 部門名:IT部  課コード600 課名:インフラ担当課 部門コード200 部門名:IT部  課コード700 課名:保守・運用担当課 画面に「部門名選択ドロップダウンリストボックス」と「課名選択ドロップダウンリストボックス」があるとき、 営業部を選んだら、営業部の課だけを選べるようにし、 IT部を選んだら、IT部の課だけを選べるようにしたいです。 JavasScriptの案(JQueryを使う・使わないはどちらでも)、Ajaxの案など、色々あるのかもしれないですが、何か参考となるサイトなどありますでしょうか? サンプルソースを探しています。 ※画面のリロードなしでやりたいです。 宜しくお願いします。 .

  • テーブル設計につきまして(正規化)

    顧客情報管理サイトを作ろうと思っています。 ・非正規化  {顧客コード , 氏名 , かな名 , 性別 , 郵便番号 , 都道府県 , 市区町村 , 建物名 , 電話番号 ,  FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  の列を考えております。 ・正規化テーブル  1.顧客情報テーブル   {顧客コード , 氏名 , かな名 , 性別 ,郵便番号(外部キー) , 建物名 , 電話番号 ,   FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  2.郵便情報   {郵便番号(主キー) , 都道府県 , 市区町村 これ以上、正規化できないと思っているのですが、顧客情報テーブルをもっと効率よく テーブルを設計し、正規化できるものでしょうか? よろしくお願いします。

  • 正規化について

    データベースを勉強していて、正規化についての問題についてお聞きしたいです。とりあえず問題をまず書いてその後自分の考えたことを述べます。以下問題です。 いま表R(A,B,C,D)があり、 Aの列の値が(a1,a2,a3,a4,a4) Bの列の値が(b1,b2,b1,b2,b3) Cの列の値が(c1,c2,c1,c3,c4) Dの列の値が(d1,d2,d1,d2,d3) となっている。 1.このとき、表Rで成り立つ関数従属を選べ。 (1)A→CD(2)B→D(3)BC→A(4)AB→CD(5)D→A 2.表Rは第一正規形であるか? 3.表Rは第二正規形であるか? 4.表Rは第三正規形ではないが、この表Rを第三正規形になるような二つの表に分割せよ。 1.について 考え方がいまいちわからないのですが、自分で考えてみて、正解は(2)のB→Dかなと思ったのですが、どうやら正解は(2)と(4)っぽいのです。 これはどのように考えたらよいのでしょうか? 社員番号、とか社員名とかいう具体的な値ならまだわかるのですが、a1とかb1とかいう値のときにどのように考えたらいいのかがわかりません。 2.について これは第一正規形でよろしいですよね? 3.について これはもし1.の正解が(2)のB→Dであった場合、R1(A,B,C),R2(B,D)と分割できるので第二正規形ではないと考えました。答えはわかりません。 4.について 第三正規形と第二正規形の違いがわからないのでぜんぜんわかりません。 以上についてわかる方いらっしゃいましたら教えてください。よろしくお願いします。

  • 正規化の問題

    http://www.techscore.com/tech/sql/16_02.html のサイトを参考に正規化の仕方を勉強しています。 そこで質問なのですが、上のURLの一番最後の実習課題の問題の第一正規化からつまずいています。 図書館貸し出しカードにて、 固定部分が (発行日、貸出日、返却予定日、会員番号、会員名) 繰り返し部分が (書籍番号、書籍名、著書) なので、 とりあえず1つヘッダ的な表は (発行日、貸出日、返却予定日、会員番号、会員名) として、分離する表の主キーは何にすべきなのか迷います。 (発行日、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (会員番号、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (発行日、会員番号、書籍番号、書籍名、著書) として主キーを(発行日、会員番号、書籍番号)とするのかです。 どれも間違っているかもしれませんが、固定ヘッダ部分の表と繰り返し部分の表を結びつける属性が「発行日」だけじゃ同じ発行日で借りる人はたくさんいるだろうし、、でも「会員番号」だけじゃ他の日に発行した本の情報はどうなってしまうのだろうかとか、色々考えてしまって困惑しています^^; どなたかお助けください。

    • ベストアンサー
    • MySQL