第2正規形と第3正規形
本日のリレーション
今回は下記の【履修リスト】と【学生リスト】を対象に解説します. 【履修リスト】は,学籍番号,科目名,成績,教室, 【学生リスト】は,学籍番号,氏名,学年,学部,キャンパスで構成されています. また,下線は主キーを表しています.
学籍番号 | 科目名 | 成績 | 教室 |
---|---|---|---|
A001 | 情報処理演習 | A | 001 |
A001 | プログラミング | A | 003 |
A002 | 情報処理演習 | A | 001 |
A002 | プログラミング | B | 003 |
B003 | データベース | A | 002 |
B003 | プログラミング | C | 003 |
【履修リスト】
学籍番号 | 氏名 | 学年 | 学部 | キャンパス |
---|---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 | 春日井 |
A002 | 岩村優 | 1 | 工学部 | 春日井 |
B003 | 杉江弘子 | 3 | 人文学部 | 春日井 |
C004 | 仙波あすか | 1 | 国際関係学部 | 名古屋 |
【学生リスト】
完全関数従属
前回,関数従属性について学びました. 関数従属性は$A \rightarrow B$と記述し, 属性$A$の値に応じて,属性$B$の値が一意に定まることを意味しています.
例えば,【履修リスト】において,$科目名 \rightarrow 教室$が成立しています. 情報処理演習であれば001,プログラミングであれば003のように一意に定まっているからです.
では,$\{学籍番号,科目名\} \rightarrow 教室$はどうでしょうか. 学籍番号だけでは教室が一意に決まりませんが, 科目名が決定子(矢印の左側)に含まれているため, この場合でも関数従属性は成立すると考えます.
$科目名 \rightarrow 教室$のように,決定子に冗長な属性が含まれていない状態が理想的であり, これを 完全関数従属 と呼びます.
完全関数従属
関数従属性$A \rightarrow B$において,$A$の任意の部分集合$A' \in A$について, $A' \rightarrow B$が成立しないとき,$A \rightarrow B$は完全関数従属である.
第2正規形
既に第1正規形の定義は解説しました. 第1正規形とはリレーションのドメインが シンプル であることが条件でした. ここでは,より厳しい制約の 第2正規形(Second Normal Form: 2NF) について考えます.
第2正規形
リレーション$R$が下記の条件を満たすとき 第2正規形 であるという.
- $R$は第1正規形である.
- $R$の全ての非キー属性が,$R$の主キー(候補キー)に完全関数従属している.
上記が第2正規形の条件です. ここで,非キー属性 とは,主キー(候補キー)を除いた属性のことを指しています.
それでは,【履修リスト】を例に考えてみましょう. 【履修リスト】が第1正規形を満たしていることは明白です. よって,二つ目の条件が成立するかどうかを,ここでは検討します.
【履修リスト】の主キーは$\{学籍番号,科目名\}$, 非キー属性は 成績 と 教室 です. では,成績と教室を非決定子とする完全関数従属を挙げてみます.
$$ \{学籍番号,科目名\} \rightarrow 成績 $$
$$ 科目名 \rightarrow 教室 $$
成績は主キーに完全関数従属していますが, 教室は主キーの一部である科目名に完全関数従属しています. よって,【履修リスト】は第2正規形ではありません. このままでは,前回述べたような 更新時異常 が発生する可能性があります. そこで,$科目名 \rightarrow 教室$を軸に情報無損失分解します. つまり,【履修リスト】を【成績リスト】(学績番号,科目名,成績)と 【科目リスト】(科目名,教室)に分解すれば良いということです. 分解した結果は下記のようになります.
学籍番号 | 科目名 | 成績 |
---|---|---|
A001 | 情報処理演習 | A |
A001 | プログラミング | A |
A002 | 情報処理演習 | A |
A002 | プログラミング | B |
B003 | データベース | A |
B003 | プログラミング | C |
【成績リスト】
科目名 | 教室 |
---|---|
情報処理演習 | 001 |
プログラミング | 003 |
データベース | 002 |
【科目リスト】
例題1
下記のリレーション【注文】を第2正規形に分割せよ.
顧客ID | 注文ID | 注文日 | 顧客名 | 顧客規模 |
---|---|---|---|---|
C1 | O1 | 2019/4/1 | X | 大 |
C1 | O2 | 2019/5/1 | X | 大 |
C2 | O1 | 2019/4/1 | Y | 小 |
C2 | O2 | 2019/6/1 | Y | 小 |
C2 | O3 | 2019/7/1 | Y | 小 |
C3 | O1 | 2019/6/1 | Z | 大 |
第3正規形
最後に 第3正規形(Third Normal Form: 3NF) について考えます. 一般的には,この第3正規形の条件を満たせば,データベースの運用には問題ないとされます.
第3正規形
リレーション$R$が下記の条件を満たすとき 第3正規形 であるという.
- $R$は第2正規形である.
- $R$の全ての非キー属性は,$R$の主キー(候補キー)に推移的に関数従属していない.
ここで,推移的 という表現が用いられています. これはどういった意味でしょうか.
推移的関数従属性
リレーション$R(A,B,C)$において, 下記のように関数従属性が成立しているとき, 推移的関数従属性$A \rightarrow C$ が成立する (ただし$B \rightarrow A$ また $C \rightarrow A$ は成立しない). $$ A \rightarrow B $$ $$ B \rightarrow C $$
それでは,【学生リスト】を例に考えてみましょう. 【学生リスト】の主キーは学籍番号, 非キー属性は 氏名 ,学年,学部,キャンパスです. では,氏名,学年,学部,キャンパスを非決定子とする完全関数従属を挙げてみます.
$$ 学籍番号 \rightarrow 氏名 $$
$$ 学籍番号 \rightarrow 学年 $$
$$ 学籍番号 \rightarrow 学部 $$
$$ 学籍番号 \rightarrow キャンパス $$
いずれの非キー属性も主キーに完全関数従属しています. よって,【学生リスト】は第2正規形であることは間違いありません. しかし,$学籍番号 \rightarrow キャンパス$は,推移的関数従属性 が成立しています. なぜなら,学籍番号によって学部が一意に決まり, 学部によってキャンパスが一意に決まるという関係が存在しているからです.
$$ 学籍番号 \rightarrow 学部 $$
$$ 学部 \rightarrow キャンパス $$
よって,【学生リスト】は第3正規形ではありません. そこで,$学部 \rightarrow キャンパス$を軸に情報無損失分解します. つまり,【学生リスト】を【所属リスト】(学籍番号,氏名,学年,学部)と 【学部リスト】(学部,キャンパス)に分解すれば良いということです. 分解した結果は下記のようになります.
学籍番号 | 氏名 | 学年 | 学部 |
---|---|---|---|
A001 | 岩城隼人 | 2 | 工学部 |
A002 | 岩村優 | 1 | 工学部 |
B003 | 杉江弘子 | 3 | 人文学部 |
C004 | 仙波あすか | 1 | 国際関係学部 |
【所属リスト】
学部 | キャンパス |
---|---|
工学部 | 春日井 |
人文学部 | 春日井 |
国際関係学部 | 名古屋 |
【学部リスト】
例題2
下記のリレーション【顧客】を第3正規形に分割せよ.
顧客ID | 顧客名 | 顧客規模 | 業種ID | 業種名 |
---|---|---|---|---|
C1 | X | 大 | B1 | 飲食 |
C2 | Y | 小 | B1 | 飲食 |
C3 | Z | 大 | B2 | 建設 |
情報処理技術者試験・過去問
下記リンクは ITパスポート試験ドットコム, 基本情報技術者試験ドットコム, 応用情報技術者試験ドットコムに掲載されている問題です.