ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3494186 データ正規化について
質問者:hamasaki-- 【質問内容】
自分で途中までやったんですが、(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 = 職種コード + 職種名
困り度:
  • すぐに回答を!
質問投稿日時:
07/11/06 14:45
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

ANo.2 #1 です。
少し勘違いがありましたので、修正します。

【第2正規形】
{従業員番号,職種コード}→{経験年数} の関係と、{職種コード}→{職種名} の関係を分割する必要がありますので

従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名
職種歴表 = 従業員番号 + 職種コード + 経験年数
職種 = 職種コード + 職種名

第三正規形は結果的には先に書いたもので正しいと思います。
回答者:toshih2000
種類:回答
どんな人:経験者
自信:参考意見
回答日時:
07/11/07 00:10
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 職種コードの一部が部門コードの位置へずれているので、少し悩みました。
とりあえず、正規形についてかきます。

【第1正規形】
繰り返しの項目を無くせば良く、表の空欄に適当な値がすべて入れば良いでしょう。
表の分割の必要は必ずしもありません。
あえて分割すると、この場合には、下の第二正規形と同じになります。

【第2正規形】
部分関数従属を無くす。
例 {従業員番号,経験年数}→{職種コード} の関係がある一方で {従業員番号}→{従業員名}の関係があります。
{従業員番号}は{従業員番号,経験年数}の一部分なので、こういう物を無くす必要があります。

従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名
職種歴表 = 従業員番号 + 職種コード + 職種名 + 経験年数

【第3正規形】
推移的関数従属を無くす。
例 {従業員番号}→{部門コード}→{部門名} の様に連続的に関数従属している形を無くします。
{従業員番号}→{部門コード}, {部門コード}→{部門名} となるように分割します。

従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード
職種歴表 = 従業員番号 + 職種コード + 経験年数
部門 = 部門コード + 部門名
職種 = 職種コード + 職種名

こういう感じになるのでは無いかと思います。
※バッカス表記法はよく知らないので適当にかきました。
回答者:toshih2000
種類:回答
どんな人:経験者
自信:参考意見
回答日時:
07/11/06 23:45
この回答へのお礼ご回答ありがとうございます。
バッカス表記法は、
職種歴表 = 従業員番号 + 従業員名 +
      {職種コード + 職種名 + 経験年数}
というような表現の仕方と習いました。
この正規化をもとにして、SQL−DDLを書いてみたいと思います。
本当にありがとうございました。
 
最新から表示回答順に表示