情報系のべんきょう

情報系のノートを作ります.ビギナー向けでは無いです.

正規化

正規化

まずは用語をいくつか定義します.

表中のタプルを一意に決定することのできる属性を主キーといいます.

つまり,表中に主キーの値が同じ行が複数存在することはありません.複数存在すればタプルを一意に決定できないためです.

下の表1では,学籍番号が主キーになります.その他の属性の値を1つ決めてもタプルは一意に決まるとは限りません.

例えば,学部が農学部という指定をしたところで0004の田中さんと0007の宮地さんの2人がいて一意にタプルは定まっていません.

f:id:chankilu23:20201217130107j:plain

表中に主キーの役割を果たす属性が複数存在することもあって,これを主キーの候補という意味で候補キーといいます.

候補キーの中から主キーを1つ選びますが,選ばなかった候補キーのことを主キーの代わりができるぞという意味で代替キーといいます.

上の表1において,住所が同じ人がいないと仮定するなら住所も主キーになりえます.

つまり,学籍番号と住所は候補キーですが,主キーとして学籍番号を選ぶなら住所は代替キーです.


候補キーに求められる性質で,表中に同じ値を持つ行が複数存在しないというものをユニーク制約といいます.

また,主キーに求められる性質で,主キーの値にNULL値を持つことができないというものを非NULL制約といいます.


また,単独の属性でタプルを一意に決定できないときは複数の属性を組み合わせたものを候補キーとしますが,これを複合キーといいます.

ここで,候補キーには極小という性質が求められます.極小とは簡単に言えば必要最低限という意味です.

上の例で学籍番号と住所は候補キーでしたので,当然学籍番号と住所を組み合わせたものでもタプルを一意に決定できます.

しかしこれは候補キーの極小という性質を満たしていないので候補キーにはなりえません.

日本語が難しいですが,{学籍番号}や{住所}は候補キー,{学籍番号,住所}は候補キーでない,と書くと少しスッキリしそうです.


属性Aの値が決まると属性Bの値も1つに決まるとき,属性Bは属性Aに関数従属するといいます.

主キー以外の属性は必ず主キーに関数従属することがわかると思います.

上の表1では,例えば氏名は学籍番号に関数従属します.


外部キーとは,その値によって他の表のタプルを一意に決定できる属性のことです.

外部キーにおいては,参照先との間に参照制約という制約が発生します.

大まかには以下の2つの利点があります.

・参照先に存在しないような値を持つものは参照元の表に登録できない

・参照している行を参照先の行から削除できない

外部キーについては記事の最後で具体例を使って確認します.

第1正規化

第1正規化では繰り返し属性というのがキーワードになります.

繰り返し属性を持つとは,1つの属性が複数の値を持った状態を指し,下の表2のような状態です.

f:id:chankilu23:20201217130239j:plain

0004の田中さんと0006の橋本さんを見ると,所属サークルが繰り返し属性になっているのがわかります.

このような状態から,値ごとに行を分けて下表のような状態にする操作を第1正規化といいます.

f:id:chankilu23:20201217130324j:plain

そして,第1正規化を行い繰り返し属性を排除した表の形式を第1正規形といいます.

それに対し,繰り返し属性を持つような表の形式を非正規形といいます.

当然ですが,全ての表が非正規形であるとは限らず,初期状態が既に第1正規形である表もあります.

第2正規化

第2正規化では部分関数従属というのがキーワードです.

部分関数従属とは,主キーのうち一部分のみに関数従属することです.

表のうち,部分関数従属している属性のみを別の表に分割する操作を第2正規化といいます.

そして,第2正規化を行い主キーに部分関数従属する属性を排除した表の形式を第2正規形といいます.


上の表3では,主キーは{学籍番号,所属サークル}です.

学籍番号だけではタプルを一意に決定できないことに注意してください.

このとき,氏名,学部,学部コードは主キー{学籍番号,所属サークル}のうち学籍番号のみに関数従属しています.

これは第2正規形に反しているので,そこだけ別表に切り取り,下の表4のようになります.

f:id:chankilu23:20201217130413j:plain

第3正規化

第3正規化では推移的関数従属というのがキーワードです.

推移的関数従属とは,その名の通り関数従属の関係が推移的に辿れるものです.

例えば,上の表4では学籍番号が決まると学部が一意に決まります.そして学部が決まると学部コードも一意に決まります.

つまり,学籍番号  \to 学部  \to 学部コードの順に推移的な関数従属があることがわかります.

このような関係を別表に切り出して下の表5のようにすればOKです.

f:id:chankilu23:20201217130441j:plain

ここで,初めに紹介した外部キーを思い出してみましょう.

以下の表6のようにそれぞれエンティティ名をつけておきます.

f:id:chankilu23:20201217192503j:plain

学生エンティティでは学部が外部キーになります.

実際,学生エンティティの学部が1つ決まれば学部エンティティのタプルが一意に定まります.

さらに外部キーの参照制約を確認してみます.

学部エンティティにない法学部に所属する学生を学生エンティティに追加することはできません.

また,学部エンティティの工学部は学生エンティティで使用されているので,学部エンティティから工学部という値は削除できません.


正規化の話はこんなかんじです.

次はSQLの話です.

SQLはほとんど知識がないので更新にさらに時間がかかるかもしれないです.

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」