footmark

ひよっこエンジニアの足跡

【備忘録】第3正規形

RDBのテーブル設計における第3正規形の導出ですが、いつも導出例を見ながら雰囲気でやってしまうので、一回きちんと勉強しようと思った足跡的な記事。

  • 第3正規形までの持ってき方忘れた
  • 第3正規形ってこれであってる?

となった時のための備忘録。

非正規形

以下の表を例に正規化を進めていきます。

学籍番号 名前 地区コード 住所 部活動
101 鈴木 太郎 鈴木太郎 1 地方A 野球部、吹奏楽
102 田中 一郎 田中一郎 2 地方B サッカー部、軽音楽部
103 吉田 健太 吉田健太 3 地方C 水泳部

第1正規形

定義

リレーションがスカラ値のみを持ちうる

リレーションの正規化 - Wikipedia

用語

  • スカラ値
    • それ以上分割できない値

リレーションの正規化 - Wikipedia

つまり

全ての属性(列)の値が、複数の値や他の属性から導出できる値でない状態。

非正規形の状態では、部活動属性に複数の値を持つ学生がいるので分割します。

学籍番号 名前 地区コード 住所 部活動
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正規形で、かつ、すべての非キー属性が、すべての候補キーに対して完全従属する

リレーションの正規化 - Wikipedia

用語

  • 関数従属性
    • 一方の値が決まると他の項目の値も一意に決まる関係

正規化

  • 完全従属
    • ある値がある候補キーにおける全ての属性によって一意に決まる関係
  • 部分従属
    • ある値がある候補キーにおける一部の属性によって一意に決まる関係
  • 候補キー
    • 組(行)の識別のために必要な属性またはその集合
  • 非キー属性
    • 候補キーでない属性

候補キー - Wikipedia

まずリレーションにおける候補キーを探します。
今回は

  • 学籍番号

だけですね。
もし同姓同名の学生が存在しない状況であれば、

の集合も候補キーとなります。

話が逸れました。
候補キーが学籍番号属性のみなので、非キー属性が候補キーに完全従属しているのは自明です。
よって第1正規形の段階で第2正規形の条件を満たしていたことになります。
(例が悪いw)

第3正規形

定義

リレーションが、第2正規形で、かつ、非キー属性があるならば、それら全てが候補キーに非推移的に関数従属する

リレーションの正規化 - Wikipedia

用語

  • 推移的に関数従属する
    • 候補キーA及び非キー属性B, Cを含むリレーションがあり、A → BかつB → Cのとき、Cは候補キーAに推移的に関数従属する
  • 非推移的に従属する
    • 関数従属するが推移的に関数従属していないこと

リレーションの正規化 - Wikipedia

今回の例では候補キー 学籍番号から非キー属性 地区コードが求められ、地区コードから非キー属性 住所が求められます。
よって住所が学籍番号に推移的に関数従属しているので、地区コードと住所の関係を別表に移すことによりこの関係を除去します。

学籍番号 地区コード 部活動
101 鈴木 太郎 1 野球部
101 鈴木 太郎 1 吹奏楽
102 田中 一郎 2 サッカー部
102 田中 一郎 2 軽音楽部
103 吉田 健太 3 水泳部

地区コード 住所
1 地方A
2 地方B
3 地方C

これで第3正規形の完成です。

まとめ

第1正規形

  • 複数の値を分割する
  • 他の属性から導出できる属性を除去する

第2正規形

  1. 候補キーを探す
    • 候補キー:特定の行を一意に求めることができる属性や属性の集合
  2. 非キー属性が候補キーの一部から求まる関係をなくす(候補キーが集合である場合)
    • 非キー属性:候補キーでない属性

第3正規形

  1. 非キー属性から他の非キー属性が求まる関係をなくす

あとがき

導出例だけで勉強したときに生まれた冗長を消す意味でのアウトプットだったんですが、結果、定義と用語説明が引用のオンパレードになってしまいました。。。
つまり基礎が大切ってことなんですが、分かりやすさが微塵もないので要リファクタリングですね。