雪太郎の学習する日々

英語・プログラミングの勉強中。勉強の備忘録や思ったことを不定期に放り込んでいきます。

応用情報技術者試験の学習メモ データベース<正規化>

 

徹底攻略 応用情報技術者教科書 平成27年度 (Tettei Kouryaku JOHO SHORI)

徹底攻略 応用情報技術者教科書 平成27年度 (Tettei Kouryaku JOHO SHORI)

 

応用情報技術者試験の三大難所(私が勝手にそう思っている)、データベース。

一度理解してしまえばそんなに難しくないかな・・・と思っていますが、SQLを実務で使ったのは数年前。もはや記憶の彼方です(泣)

データベースの基本的な用語やSQLの復習をしていきたいと思います。

なお、ノートに書いてあることを書くだけですので、正確かどうかは保証しません。

 

ではいきなり正規化からいきます。

正規化とその目的。

正規化とは規則に従ってテーブル(表)を分割すること。

目的は更新時異常の排除。データを分けて、データの重複を排除し、一つのデータを一か所に保管する(1 facet in 1 place)ことで、データの整合性を保つ。

ここで重要なのは、更新しないのであれば正規化しなくていいということ。また、正規化することで高速化が失われる(処理が遅くなる)デメリットを把握しておくこと。

正規化は、

非正規化形の表から第1正規形⇒第2正規形⇒第3正規形⇒高次正規形となる。

実務で使われるのはだいたい第3正規形まで。

では、それぞれの正規化の形を見ていく。

 

第1正規形

第1正規形はドメインがシンプルであること。このドメインがシンプルとはテーブルの1マスにデータが1つだけ入っている状態のこと。そのために繰返し属性を排除して単純な表にする。

※属性:とりあえず難しいことは考えずにテーブルの列(項目)と考える。

 

この非正規形のテーブルを見ると、{得意先名(会社種別)}の属性に得意先名と会社種別の二つのデータが入ってしまっている。また{伝票番号}や{得意先名のデータもセルが結合され、二つのレコードのデータをあたかも一つのデータのようになっている。見た目はいいかもしれないが、データベースとしてはよくない。

正規化をして、一つのマスにデータが1つという形(第1正規形)のテーブルにする。

伝票番号得意先番号得意先名(会社種別)商品番号商品名数量
3001 101 ABC建設(株式会社) 1001 A4ファイル 50
1002 ボールペン 20
3002 102 山田システム(株式会社) 1001 A4ファイル 80
1003 ノート 50
3003 103 関谷植木(有限会社) 1002 ボールペン 30
1004 コピー用紙 100
3004 104 東キッチン(株式会社) 1002 ボールペン 20

 

これを第一正規化する。

伝票番号得意先番号得意先名会社種別商品番号商品名数量
3001 101 ABC建設 株式会社 1001 A4ファイル 50
3001 101 ABC建設 株式会社 1002 ボールペン 20
3002 102 山田システム 株式会社 1001 A4ファイル 80
3002 102 山田システム 株式会社 1003 ノート 50
3003 103 関谷植木 有限会社 1002 ボールペン 30
3003 103 関谷植木 有限会社 1004 コピー用紙 100
3004 104 東キッチン 株式会社 1002 ボールペン 20

{得意先名(会社種別)}が{得意先名}{会社種別}と別れ、1つのマスに一つのデータが入っている。

ドメインとリレーション(関係)がシンプル(単一値)になっている。

 

第2正規形

1つのキーで1つのレコードを特定できる。

リレーションが第1正規形で、すべての非キー属性が候補キーに対して下院全関数従属している

部分関数従属(候補キーの一部だけに関数従属している属性)を排除して別の表にする。

つまり、第1正規形からキーに従って、表を分けてしまうのが第2正規形である。

 

例えば、先ほどの第1正規形の表では{伝票番号}だけでは行を特定することはできない。「{伝票番号}が3001の行」といっても、一行目、二行目と行が二つあるためどちらの行のことをいっているのかわからない。ここで、「{伝票番号}が3001で、{商品番号}が1001の行」といって初めて一行目の行を特定できる。

この{伝票番号}と{商品番号}の二つの属性がこの表の一意の行を特定できる候補キーである。

◆部分関数従属を排除しているとはどういうことか?

候補キーの一部だけに関数従属している属性を排除すること。

この表の候補キーは{伝票番号、商品番号}だから、

1.{伝票番号}だけに関数従属している属性

2.{商品番号}だけに関数従属している属性

3.{伝票番号、商品番号}だけに従属している属性

に分けるということである。

※関数従属:{商品番号}で{商品名}を特定できる場合、{商品名}は{商品番号}に関数従属しているという。

 

では第1正規形の表から、

伝票番号得意先番号得意先名商品番号商品名数量
3001 101 ABC建設 1001 A4ファイル 50
3001 101 ABC建設 1002 ボールペン 20
3002 102 山田システム 1001 A4ファイル 80
3002 102 山田システム 1003 ノート 50
3003 103 関谷植木 1002 ボールペン 30
3003 103 関谷植木 1004 コピー用紙 100
3004 104 東キッチン 1002 ボールペン 20

 

第2正規化する。

1.{伝票番号}だけに関数従属している属性

伝票番号得意先番号得意先名
3001 101 ABC建設
3002 102 山田システム
3003 103 関谷植木
3004 104 東キッチン

2.{商品番号}だけに関数従属している属性

商品番号商品名
1001 A4ファイル
1002 ボールペン
1003 ノート
1004 コピー用紙

3.{伝票番号、商品番号}だけに従属している属性

伝票番号商品番号数量
3001 1001 50
3001 1002 20
3002 1001 80
3002 1003 50
3003 1002 30
3003 1004 100
3004 1002 20

 

第3正規形

第2正規形ですべての非キー属性がいかなる候補キーにも推移的に関数従属していないこと。

推移的関数従属(候補キー以外の属性に関数従属している属性)の排除

 

◆推移的関数従属とは?

{属性A(主キー)}、{属性B}、{属性C}があるテーブルで考える。このテーブルで、{B}は{A}に関数従属しており、{C}は{B}に関数従属している。すなわち、A⇒B⇒Cで{C}は{A}に推移的関数従属しているといえる。

では、実際にテーブルで考えてみる。

先ほどの第2正規形にした1のテーブルを見てみる。

伝票番号得意先番号得意先名
3001 101 ABC建設
3002 102 山田システム
3003 103 関谷植木
3004 104 東キッチン

主キーである{伝票番号}に{得意先番号}は従属しており、{得意先名}は{伝票番号}に直接的に関数従属していない。{得意先名}は{得意先番号}に従属しており、{得意先名}は{伝票番号}に推移的に関数従属している。

つまり、{伝票番号}⇒{得意先番号}⇒{得意先名}となっている。

 

この推移的関数従属を排除するために、表を

1.{伝票番号}⇒{得意先番号}

2.{得意先番号}⇒{得意先名}

の形に分割する。

 

1.{伝票番号}⇒{得意先番号}

伝票番号得意先番号
3001 101
3002 102
3003 103
3004 104

2.{得意先番号}⇒{得意先名}

得意先番号得意先名
101 ABC建設
102 山田システム
103 関谷植木
104 東キッチン

 

これで第3正規形となる。

ちなみに{得意先番号}は2の表では主キーとなり、1の表では外部キーとなる。

================================================

応援クリックお願いします☆ <m(__)m>

にほんブログ村 資格ブログへにほんブログ村

にほんブログ村 資格ブログ IT系資格へにほんブログ村

スポンサーリンク