高次の正規化
高次の正規化
リレーショナルデータベースに関連する実際の業務では, これまでに紹介した第3正規形を満たすように情報無損失分解しておけば問題ありません. 一方で,厳密な設計が求められる場合,より高次の正規形を必要とするケースも考えられます. 高次の正規形は次に挙げる3つですが,ここでは第4正規形まで取り上げることにします.
- ボイス・コッド正規形
- 第4正規形
- 第5正規形
高次の正規形を説明する前に,第3正規形までを振り返っておきましょう.
第1正規形
第1正規形 は,ドメインがシンプルであることが条件です. ドメインが,「複数のドメインの直積」や,「あるドメインのべき集合」となっていることは認められません.
第1正規形
リレーション$R=(A_1, A_2, \cdots, A_n)$の各ドメインがシンプルであるとき第1正規形であるという.
第2正規形
第2正規形は,主キー以外の属性が,主キーに完全関数従属していることが条件です. 主キーが複数の属性で構成されているとき,主キーを構成する一部の属性に関数従属していることは認められません.
第2正規形
リレーション$R$が下記の条件を満たすとき 第2正規形 であるという.
- $R$は第1正規形である.
- $R$の全ての非キー属性が,$R$の主キー(候補キー)に完全関数従属している.
第3正規形
第3正規形は,主キー以外の属性が,主キーに推移的に従属していないことが条件です(第2正規形は満たしているので,主キーに完全関数従属はしている).
第3正規形
リレーション$R$が下記の条件を満たすとき 第3正規形 であるという.
- $R$は第2正規形である.
- $R$の全ての非キー属性は,$R$の主キー(候補キー)に推移的に関数従属していない.
正規化の手順
次の【プロジェクトメンバー】を例に,第3正規形に変形してみましょう. このリレーションは,複数の企業から選抜された社員で構成されるプロジェクトのメンバーを表しています. 主キーは会社番号と社員番号のペアで構成され,社員は一つのプロジェクトに割り当てられます.
会社番号 | 社員番号 | 氏名 | 業種 | 担当プロジェクト | ターゲット |
---|---|---|---|---|---|
C01 | E01 | 加藤淳 | 製造業 | A | 主婦層 |
C01 | E02 | 青木健二 | 製造業 | A | 主婦層 |
C01 | E03 | 鈴木由香 | 製造業 | B | 若年層 |
C02 | E01 | 渡辺大樹 | 情報通信業 | B | 若年層 |
C02 | E02 | 松本恭子 | 情報通信業 | A | 主婦層 |
【プロジェクトメンバー】
第1正規形への正規化
最初に,第1正規形の判定をします. 全てのドメインがシンプルであることは明らかです. このため,【プロジェクトメンバー】は第1正規形を満たしています.
第2正規形への正規化
次に,第2正規形の判定をします. 非キー属性の関数従属をチェックします.
$$ \{会社番号, 社員番号\} \rightarrow 氏名 $$
$$ 会社番号 \rightarrow 業種 $$
$$ \{会社番号, 社員番号\} \rightarrow 担当プロジェクト $$
$$ \{会社番号, 社員番号\} \rightarrow ターゲット $$
このとき,業種は主キーの一部(会社番号)に関数従属しているため, 主キーに完全関数従属していません. よって,【プロジェクトメンバー】は第2正規形ではありません. そこで,次のように情報無損失分解します.
会社番号 | 社員番号 | 氏名 | 担当プロジェクト | ターゲット |
---|---|---|---|---|
C01 | E01 | 加藤淳 | A | 主婦層 |
C01 | E02 | 青木健二 | A | 主婦層 |
C01 | E03 | 鈴木由香 | B | 若年層 |
C02 | E01 | 渡辺大樹 | B | 若年層 |
C02 | E02 | 松本恭子 | A | 主婦層 |
【プロジェクトメンバー】
会社番号 | 業種 |
---|---|
C01 | 製造業 |
C02 | 情報通信業 |
【業種リスト】
これで,全ての非キー属性が主キーに完全関数従属しています. よって,【プロジェクトメンバー】は第2正規形です.
第3正規形への正規化
次に,第3正規形の判定をします. 非キー属性の推移的な関数従属をチェックします.
$$ \{会社番号, 社員番号\} \rightarrow 担当プロジェクト \rightarrow ターゲット $$
このとき,ターゲットは,担当プロジェクトを介して,推移的に主キーに関数従属しています. よって,【プロジェクトメンバー】は第2正規形ではありません. そこで,次のように情報無損失分解します.
会社番号 | 社員番号 | 氏名 | 担当プロジェクト |
---|---|---|---|
C01 | E01 | 加藤淳 | A |
C01 | E02 | 青木健二 | A |
C01 | E03 | 鈴木由香 | B |
C02 | E01 | 渡辺大樹 | B |
C02 | E02 | 松本恭子 | A |
【プロジェクトメンバー】
担当プロジェクト | ターゲット |
---|---|
A | 主婦層 |
B | 若年層 |
【プロジェクリスト】
これで,全ての非キー属性に推移的に関数従属は存在しません. よって,【プロジェクトメンバー】は第3正規形です.
ボイス・コッド正規形
ボイス・コッド正規形(Boyce-Codd Normal Form: BCNF) は, 第3正規形をより厳密に定義した正規形であり, Edgar Frank Codd氏とRaymond F. Boyce氏によって定義されました(第3.5正規形とも呼ばれる). 第3正規形であれば,既にボイス・コッド正規形を満たしていることが殆どで, ボイス・コッド正規形を満たしてないリレーションは極めて珍しいとされています.
例えば,次の【参加研修リスト】を考えます. 主キーは社員番号と研修のペアで構成されています. このとき,社員は複数の異なる内容の研修を受けることが出来ますが, 同じ研修内容を複数受けることは出来ません(E01は鈴木のプログラミングを受けられない). また,1つの研修を1人の講師が担当します. 講師は同一内容の研修を複数担当することがありますが, 異なる内容の研修を担当することはありません(伊藤はマナーを担当できない).
社員番号 | 研修 | 講師 |
---|---|---|
E01 | プログラミング | 伊藤 |
E01 | マナー | 山田 |
E02 | プログラミング | 鈴木 |
E03 | マナー | 山田 |
E03 | リーダシップ | 武田 |
【参加研修リスト】
このとき,次の関数従属が成立します.
$$ \{ 社員番号,研修 \} \rightarrow 講師 $$
非キー属性が主キーに完全関数従属しているため第2正規形です. また,推移的な関数従属も存在しないので,第3正規形であることも間違いありません.
一方で,次の関数従属が成立しています.
$$ 講師 \rightarrow 研修 $$
このように,主キーである 研修 が,非キー属性である 講師 に関数従属していると ボイス・コッド正規形とはならず,タプル挿入時異常などの更新時異常が発生します.
ボイス・コッド正規形
リレーション$R$が下記の条件を満たすとき ボイス・コッド正規形 であるという.
- $R$に存在する関数従属 $X \rightarrow Y$ の $X$ は主キーである
- または,$Y \in X$であり 自明な関数従属である
例として,タプル挿入時異常を考えてみましょう. ある講師の「高木」が新たに「リーダーシップ」の研修を担当することが決まった場合, 次のタプルを追加することが必要です. しかし,社員番号が空値であるため,主キー制約に違反してしまいます.
社員番号 | 研修 | 講師 |
---|---|---|
リーダーシップ | 高木 |
そこで,次のように情報無損失分解します. 分解後は「講師」が主キーになり,「研修」が非キーとなっていることに注意してください. これらのリレーションはボイス・コッド正規形を満たしています.
社員番号 | 講師 |
---|---|
E01 | 伊藤 |
E01 | 山田 |
E02 | 鈴木 |
E03 | 山田 |
E03 | 武田 |
【参加研修リスト】
講師 | 研修 |
---|---|
伊藤 | プログラミング |
山田 | マナー |
鈴木 | プログラミング |
武田 | リーダシップ |
【講師リスト】
例題1
ボイス・コッド正規形では上記のタプル挿入時異常が発生しないことを確認せよ.
第4正規形
第4正規形は 多値従属性 という概念が必要となります.
多値従属性
多値従属性は,関数従属性を包括する概念であり,関数従属性が成立すれば,多値従属性も成立しています. 関数従属性は,ある属性の値$X$に応じて,他の属性の値$Y$が 一意 に決まります. 一方,多値従属性は,ある属性の値$X$に応じて,他の属性の値$Y$の 候補 が決まるという特徴があります.
関数従属は,情報無損失分解の 十分条件 でした. つまり,関数従属が成立すれば,情報無損失分解が可能ですが, 関数従属が成立しない場合でも情報無損失分解が可能なケースがあります. 一方で,多値従属性は,情報無損失分解の 必要十分条件 です. つまり,多値従属性が成立すれば,情報無損失分解が可能であり, 逆に成立しない場合は,情報無損失分解は不可能です.
多値従属性
リレーション$R(A, B, C)$が,リレーション$R_1=(A,B)$と$R_2=(A,C)$に情報無損失分解されるとき,多値従属性が成立するという. 多値従属性は. $$ A \rightarrow \rightarrow B | C $$ または, $$ A \rightarrow \rightarrow B $$ $$ A \rightarrow \rightarrow C $$ のように表される.
それでは,第4正規形について,次の【研修リスト】を例に挙げて考えます. 主キーは研修,講師,社員番号の組で構成されています. 先程とは異なり,一つの研修を複数の講師が担当します. 例えば,プログラミングは伊藤と鈴木が交代で担当するため,受講する社員は共通でE01とE02の2人です. また,講師は異なる内容の研修を担当することが可能です(伊藤はプログラミングとマナーを担当している).
研修 | 講師 | 社員番号 |
---|---|---|
プログラミング | 伊藤 | E01 |
プログラミング | 伊藤 | E02 |
プログラミング | 鈴木 | E01 |
プログラミング | 鈴木 | E02 |
マナー | 伊藤 | E02 |
マナー | 山田 | E02 |
リーダシップ | 武田 | E03 |
【研修リスト】
この研修リストは,主キーは全ての属性で構成されており, 明らかにボイス・コッド正規形を満たしています.
一方で,次の多値従属性が成立します.
$$ 研修 \rightarrow \rightarrow 講師 | 社員番号 $$
これは,次のように2つの多値従属性があることを意味します.
$$ 研修 \rightarrow \rightarrow 講師 $$
$$ 研修 \rightarrow \rightarrow 社員番号 $$
このように,多値従属性が複数存在すると,第4正規形とはならず, タプル挿入時異常などの更新時異常が発生します.
第4正規形
リレーション$R$が下記の条件を満たすとき 第4正規形 であるという.
- $R$に存在する多値従属 $X \rightarrow \rightarrow Y$ が存在し,$X \rightarrow \rightarrow Z$ が存在しない
- または,$X$が主キーである
例として,タプル挿入時異常を考えてみます. 先と同じように,「リーダーシップ」の研修を講師の「高木」が担当することが決まった場合, 次のタプルを追加することが必要です. しかし,社員番号が空値であるため,主キー制約に違反してしまいます.
研修 | 講師 | 社員番号 |
---|---|---|
リーダーシップ | 高木 |
そこで,次のように情報無損失分解します. これらのリレーションは,第4正規形を満たしています.
研修 | 講師 |
---|---|
プログラミング | 伊藤 |
プログラミング | 鈴木 |
マナー | 伊藤 |
マナー | 山田 |
リーダシップ | 武田 |
【研修講師リスト】
研修 | 社員番号 |
---|---|
プログラミング | E01 |
プログラミング | E02 |
マナー | E02 |
リーダシップ | E03 |
【研修学生リスト】
例題2
第4正規形では上記のタプル挿入時異常が発生しないことを確認せよ.
情報処理技術者試験・過去問
下記リンクは 応用情報技術者試験ドットコム, データベーススペシャリスト ドットコムに掲載されている問題です.