関係データベースは正規形で正規化?

勉強のきっかけになった過去問

"受注明細"表は,どのレベルまでの正規形の条件を満足しているか。ここで,実線の下線は主キーを表す。
http://www.ap-siken.com/kakomon/29_haru/img/27.gif

ア. 第1正規形 イ. 第2正規形 ウ. 第3正規形 エ. 第4正規形
平成29年春期問27 どのレベルまでの正規形か|応用情報技術者試験.com

正規化は、データベースを使いやすくする設計規則です。

データの重複をなくし整合的にデータを取り扱えるようにデータベースを設計すること
www.oss-db.jp

正規化には、データを保護しながらデータベースをより柔軟にするよう設計された規則に従い、冗長性の除去および矛盾する従属関係を除去することによってテーブルを作成する作業、およびテーブル間のリレーションシップを確立する作業が含まれます。
データベースの正規化の基礎

なので、正規化していないと使いにくいデータベースになります。

非正規形 は正規化していなくて関係データベースに登録できない残念な状態です。

行単位の情報でしか登録できない関係データベースには、登録したくても、登録できない。
こうのような生のデータのことを非正規形と読んでいる。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/64c324157a5db9c2f283e07eac5b6aa5.png
データベースの正規化(正規形)とはなんぞや – gomokulog

正規形は、正規化するやり方の段階です。

正規形は数字が大きいほどいい感じに正規化できてます。

第1正規形は、分割する必要のない値だけを保持している状態です。

  • 一部しか違わないレコードが半端なくある状態
  • やり方
    1. 各テーブルで繰り返し現れるグループを除去します。
    2. 関連するデータごとに 1 つのテーブルを作成します。
    3. 関連するデータ セットを主キーで識別します。

1つの行にするために繰返し項目を無くして、単一値と呼ばれる形ににする。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/2bc236e2c3b8ecfcdfa5cfbc1c0b1cd9.png
データベースの正規化(正規形)とはなんぞや – gomokulog

すべての属性の値を単純な値にします。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daiichiseikikei.gif
正規化

第2正規形は、属性ごとに集めて関係性を保持している状態です。

  • キーでまとめたけど何かまとめられそうな繰り返しがある状態
  • やり方
    1. 複数のレコードに該当する値のセットごとに 1 つのテーブルを作成します。
    2. これらのテーブルを外部キーと関連付けます。

第2正規化とは、部分関数従属性を取り除くこと。<省略>
主キーが複数のキーの組み合わせ(複合キー)の場合に、全部組み合わせとかしなくても、片方のキーだけで、決まっちゃうものがある場合、部分関数従属性があるという。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/8279c60ba39b3638a7311c3d9a2cb627.png
データベースの正規化(正規形)とはなんぞや – gomokulog

主キーに部分従属している属性を分離する作業です。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daini.gif
正規化

第3正規形は、キーに紐づく情報も同じようなものは別テーブルにして関連付けた状態です。

  • 重複なくスッキリ整理できた状態
  • やり方 : キーに従属しないフィールドを除去します。

主キーじゃないやつを非キーって言うんだけど、非キーの中でも、これが決まれば実際全部求まるよね?な部分を取り除けば第三正規形になる。
http://gomocool.net/gomokulog/wp-content/uploads/2015/04/8937f2499c73899caf39f4df267a836c.png
データベースの正規化(正規形)とはなんぞや – gomokulog

テーブル内にある推移従属関係を分離して、どのテーブルであってもすべての属性が主キーに対して完全従属であるテーブルにします。
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/daisanseikika.gif
正規化

付加情報の中で重複するようなデータをさらに分割する。
http://www.fellow-ship.com/tech/img/normalize3.gif
www.fellow-ship.com

他に知っておいたほうがいいことがあります。

やり過ぎると無駄にテーブルが多くなってしまうので、アプリケーションに合わせて正規化しましょう。

第 3 正規形を遵守することが理論上望ましくても、常に実用的とは限りません。<省略>
理論上、正規化は実践する価値があります。 しかし、小さいテーブルを数多く作成するとパフォーマンスが低下したり、開くことのできるファイルおよびメモリの容量を超える場合があります。
データベースの正規化の基礎

完全に正規化されたデータベースへのクエリ(検索質問)はパフォーマンスが良くないことがある。
関係の正規化 - Wikipedia

データ検索・データ更新の頻度やリレーションの階層などと、実際の業務バランスを見て正規化は行いましょう。
場合によっては意図的に正規化を行わず性能を向上させる設計も必要です。
www.fellow-ship.com

もっと正規化した正規形はあるけどあんまり使わないらしいです。

ボイスコッド正規形 (BCNF) とも呼ばれる第 4 正規形、および第 5 正規形が存在しますが、実用的な設計と見なされることはほとんどありません。 これらの規則を無視すると、完全なデータベース設計とはならないことがありますが、機能的には影響しません。
データベースの正規化の基礎

ボイス・コッド正規形
ほとんどの場合第3正規形と等価であり、複数の属性からなる候補キーが複数存在する場合にのみ差異が生じうる。<省略>
第4正規形
候補キーではない属性への多値従属性をもった属性があってはならない。<省略>
第5正規形
その関係が第4正規形であり、さらにその関係に含まれる結合従属性の決定項が候補キーのみである
関係の正規化 - Wikipedia

わからない用語はわからないので調べました。

単一値とは、おんなじ組み合わせが繰り返さないデータのセット

データを何とか無理くりでもデータベースに登録しようとした場合、1つの行にするために繰返し項目を無くして、単一値と呼ばれる形ににする。
データベースの正規化(正規形)とはなんぞや – gomokulog

スカラ値とは、「もう分割できない!」とか「それ以上分解して操作する必要ない!」っていう値です。
  • スカラ値なもの : 数字とか人名とか物の名前とか
  • スカラ値じゃないもの : AKB48とか世界とか
  • 残った疑問 : リテラル値の違いって何?

scalarは「単体」を意味します。<省略>
簡単にイメージできるのは,プログラミング言語におけるchar,int,floatといった単一の値だけを保持するデータ型でしょう。反対に,配列,リスト,レコードなど複合的な値を保持するデータ型は,非スカラ型と呼ばれます。
gihyo.jp

導出項目とは、合計値みたいに既にある項目から計算とかすればわかる項目です。

他のデータ項目から処理や計算により導き出せる項目のことをいいます。
blog.goo.ne.jp

候補キーとは、ポスト主キーなキーです。

特定の行を識別できる列(項目)のこと
nwdb.exblog.jp

非キー属性とは、それだけでは情報を特定できないもののことです。

非キー属性は、キーに含まれない属性だ。一般的に、ほとんどの属性は単純な説明的なもので、かつこのカテゴリに含まれる。名前、苗字、誕生日という属性を考えると、大抵の場合は、非キー属性だ。
blog.livedoor.jp

関数従属性とは、キーになる項目がわかればその情報もわかることです。

一方の値が決まると他の項目の値も一意に決まる関係
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/jyuzoku.gif
正規化

推移従属関係とは、キーになる項目とその項目でわかる情報の関係です。

主キー以外の項目に従属する関係
http://ext-web.edu.sgu.ac.jp/HIKO/Prog03/SenpaiKyozai/shiohara/image/suii.gif
正規化

更新時異常とは、更新したら情報がなくなったり矛盾が発生することです。

商品テーブル作ってないもんだから、薬草の値段変えたかったら、薬草の取引に関する部分全部変えなきゃダメとか、新しい商品追加したくても、取引明細テーブルにしか商品情報が書いてないから、登録できないとか、アホみたいなこと
データベースの正規化(正規形)とはなんぞや – gomokulog

第2正規形で起こる更新時異常には次の2種類があります。
(1) 行の修正に伴って修正前に格納されていた情報が無くなってしまう。<省略>
(2) 非キー属性に関数従属している属性の値を修正するときに、該当する行の全てを修正しなければならない。<省略>更新処理を誤るとデータの不整合が生じる。
平成22年春期問7 更新するときに発生する問題|データベーススペシャリスト.com

おわりに

このぺーじでは、いろんなサイトにある解説で理解しやすいなって思ったところを集めまくって勉強しています。
わかりやすい解説をしていただいているサイト様に心から感謝です。