応用情報技術者試験の学習メモ データベース<正規化>
徹底攻略 応用情報技術者教科書 平成27年度 (Tettei Kouryaku JOHO SHORI)
- 作者: 株式会社わくわくスタディワールド瀬戸美月
- 出版社/メーカー: インプレス
- 発売日: 2014/12/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
応用情報技術者試験の三大難所(私が勝手にそう思っている)、データベース。
一度理解してしまえばそんなに難しくないかな・・・と思っていますが、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>
スポンサーリンク