高次の正規化

Image from Gyazo

高次の正規化

リレーショナルデータベースに関連する実際の業務では, これまでに紹介した第3正規形を満たすように情報無損失分解しておけば問題ありません. 一方で,厳密な設計が求められる場合,より高次の正規形を必要とするケースも考えられます. 高次の正規形は次に挙げる3つですが,ここでは第4正規形まで取り上げることにします.

高次の正規形を説明する前に,第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正規形では上記のタプル挿入時異常が発生しないことを確認せよ.

情報処理技術者試験・過去問

下記リンクは 応用情報技術者試験ドットコムデータベーススペシャリスト ドットコムに掲載されている問題です.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.