- 締切済み
データ正規化について
【質問内容】 自分で途中までやったんですが、(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 = 職種コード + 職種名
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- toshih2000
- ベストアンサー率22% (120/541)
#1 です。 少し勘違いがありましたので、修正します。 【第2正規形】 {従業員番号,職種コード}→{経験年数} の関係と、{職種コード}→{職種名} の関係を分割する必要がありますので 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表 = 従業員番号 + 職種コード + 経験年数 職種 = 職種コード + 職種名 第三正規形は結果的には先に書いたもので正しいと思います。
- toshih2000
- ベストアンサー率22% (120/541)
職種コードの一部が部門コードの位置へずれているので、少し悩みました。 とりあえず、正規形についてかきます。 【第1正規形】 繰り返しの項目を無くせば良く、表の空欄に適当な値がすべて入れば良いでしょう。 表の分割の必要は必ずしもありません。 あえて分割すると、この場合には、下の第二正規形と同じになります。 【第2正規形】 部分関数従属を無くす。 例 {従業員番号,経験年数}→{職種コード} の関係がある一方で {従業員番号}→{従業員名}の関係があります。 {従業員番号}は{従業員番号,経験年数}の一部分なので、こういう物を無くす必要があります。 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表 = 従業員番号 + 職種コード + 職種名 + 経験年数 【第3正規形】 推移的関数従属を無くす。 例 {従業員番号}→{部門コード}→{部門名} の様に連続的に関数従属している形を無くします。 {従業員番号}→{部門コード}, {部門コード}→{部門名} となるように分割します。 従業員 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード 職種歴表 = 従業員番号 + 職種コード + 経験年数 部門 = 部門コード + 部門名 職種 = 職種コード + 職種名 こういう感じになるのでは無いかと思います。 ※バッカス表記法はよく知らないので適当にかきました。
お礼
ご回答ありがとうございます。 バッカス表記法は、 職種歴表 = 従業員番号 + 従業員名 + {職種コード + 職種名 + 経験年数} というような表現の仕方と習いました。 この正規化をもとにして、SQL-DDLを書いてみたいと思います。 本当にありがとうございました。