【備忘録】第3正規形
RDBのテーブル設計における第3正規形の導出ですが、いつも導出例を見ながら雰囲気でやってしまうので、一回きちんと勉強しようと思った足跡的な記事。
- 第3正規形までの持ってき方忘れた
- 第3正規形ってこれであってる?
となった時のための備忘録。
非正規形
以下の表を例に正規化を進めていきます。
学籍番号 | 性 | 名 | 名前 | 地区コード | 住所 | 部活動 |
---|---|---|---|---|---|---|
101 | 鈴木 | 太郎 | 鈴木太郎 | 1 | 地方A | 野球部、吹奏楽部 |
102 | 田中 | 一郎 | 田中一郎 | 2 | 地方B | サッカー部、軽音楽部 |
103 | 吉田 | 健太 | 吉田健太 | 3 | 地方C | 水泳部 |
第1正規形
つまり
全ての属性(列)の値が、複数の値や他の属性から導出できる値でない状態。
例
非正規形の状態では、部活動属性に複数の値を持つ学生がいるので分割します。
学籍番号 | 性 | 名 | 名前 | 地区コード | 住所 | 部活動 |
---|---|---|---|---|---|---|
101 | 鈴木 | 太郎 | 鈴木太郎 | 1 | 地方A | 野球部 |
101 | 鈴木 | 太郎 | 鈴木太郎 | 1 | 地方A | 吹奏楽部 |
102 | 田中 | 一郎 | 田中一郎 | 2 | 地方B | サッカー部 |
102 | 田中 | 一郎 | 田中一郎 | 2 | 地方B | 軽音楽部 |
103 | 吉田 | 健太 | 吉田健太 | 3 | 地方C | 水泳部 |
また、名前属性はそれぞれ性属性と名属性から導出できるので除去します。
学籍番号 | 性 | 名 | 地区コード | 住所 | 部活動 |
---|---|---|---|---|---|
101 | 鈴木 | 太郎 | 1 | 地方A | 野球部 |
101 | 鈴木 | 太郎 | 1 | 地方A | 吹奏楽部 |
102 | 田中 | 一郎 | 2 | 地方B | サッカー部 |
102 | 田中 | 一郎 | 2 | 地方B | 軽音楽部 |
103 | 吉田 | 健太 | 3 | 地方C | 水泳部 |
これで第1正規形の完成です。
第2正規形
用語
- 関数従属性
- 一方の値が決まると他の項目の値も一意に決まる関係
- 完全従属
- ある値がある候補キーにおける全ての属性によって一意に決まる関係
- 部分従属
- ある値がある候補キーにおける一部の属性によって一意に決まる関係
- 候補キー
- 組(行)の識別のために必要な属性またはその集合
- 非キー属性
- 候補キーでない属性
例
まずリレーションにおける候補キーを探します。
今回は
- 学籍番号
だけですね。
もし同姓同名の学生が存在しない状況であれば、
- 性
- 名
の集合も候補キーとなります。
話が逸れました。
候補キーが学籍番号属性のみなので、非キー属性が候補キーに完全従属しているのは自明です。
よって第1正規形の段階で第2正規形の条件を満たしていたことになります。
(例が悪いw)
第3正規形
用語
- 推移的に関数従属する
- 候補キーA及び非キー属性B, Cを含むリレーションがあり、A → BかつB → Cのとき、Cは候補キーAに推移的に関数従属する
- 非推移的に従属する
- 関数従属するが推移的に関数従属していないこと
例
今回の例では候補キー 学籍番号から非キー属性 地区コードが求められ、地区コードから非キー属性 住所が求められます。
よって住所が学籍番号に推移的に関数従属しているので、地区コードと住所の関係を別表に移すことによりこの関係を除去します。
学籍番号 | 性 | 名 | 地区コード | 部活動 |
---|---|---|---|---|
101 | 鈴木 | 太郎 | 1 | 野球部 |
101 | 鈴木 | 太郎 | 1 | 吹奏楽部 |
102 | 田中 | 一郎 | 2 | サッカー部 |
102 | 田中 | 一郎 | 2 | 軽音楽部 |
103 | 吉田 | 健太 | 3 | 水泳部 |
地区コード | 住所 |
---|---|
1 | 地方A |
2 | 地方B |
3 | 地方C |
これで第3正規形の完成です。
まとめ
第1正規形
- 複数の値を分割する
- 他の属性から導出できる属性を除去する
第2正規形
- 候補キーを探す
- 候補キー:特定の行を一意に求めることができる属性や属性の集合
- 非キー属性が候補キーの一部から求まる関係をなくす(候補キーが集合である場合)
- 非キー属性:候補キーでない属性
第3正規形
- 非キー属性から他の非キー属性が求まる関係をなくす
あとがき
導出例だけで勉強したときに生まれた冗長を消す意味でのアウトプットだったんですが、結果、定義と用語説明が引用のオンパレードになってしまいました。。。
つまり基礎が大切ってことなんですが、分かりやすさが微塵もないので要リファクタリングですね。