はじめに
コジマです。
第一正規形、第二正規形、第三正規形
なんて言葉
理解しようとしても何とか従属?は?ってなって覚えられない人向けの記事です。
この記事を書くに至った経緯としては、この手の記事って腐るほどあるんだけど、
その他の関連ワードを難しく説明しているせいでスッと入ってこないという経験を私自身してきました。
なので、なるべく簡単に第一正規形から第三正規形までを簡単に説明しようと思った次第です。
この記事のゴールは「第一正規形、第二正規形、第三正規形ってその程度のことなんだったんだ」と思ってもらうことです。
予め知っててほしい言葉
データベース
「データベース」は、データの集まりのことを言います。
テーブル
「テーブル」は、データベースのデータを表で表したものを言います。
テーブルは行と列から成る表です。Excelをイメージするとよいかと思います。
主キー
「主キー」は、テーブルの行を1つに特定するための列のことを言います。
主キーは複数の列の組み合わせになるときもあります。(重要)
これらの言葉だけは初めに押さえておいてください。
正規化をしていく
正規化の流れを説明します。
ここで言う「正規化」というのは、テーブルの見た目をきれいにしていく作業ととらえてよいです。
その正規化の流れがセオリー化されていて、その過程に登場するものが
第一正規形、第二正規形、第三正規形というわけです。
いきなり結論を書くと以下のように表されます。
各正規形の概要
- 非正規形:正規化していないもの
- 第一正規形:列の繰り返しをなくしたもの
- 第二正規形:主キーの一部に依存するデータを別テーブルに切り出したもの
- 第三正規形:主キーじゃない列に依存するデータを別テーブルに切り出したもの
例
エンジニアのスキルを管理するデータベースを作ってみます。
非正規形
以下のように正規化されていない状態を非正規形と言います。
エンジニアID | エンジニア名 | 所属会社ID | 所属会社名 | スキルID | スキル名 | 経験年数 | スキルID | ・・・ (繰り返し) |
1 | コジマ | 1 | ABC株式会社 | 1 | JavaScript | 2 | 2 | |
2 | タナカ | 2 | ZZZ株式会社 | 2 | C# | 1 | 3 |
この場合は、スキルID・スキル名・経験年数の3つが繰り返されています。
非正規形は言い換えると、繰り返しを持つ状態ということもできます。
第一正規形
第一正規形はここから繰り返しをなくします。
横に伸びているものを縦に積みなおすイメージ。
スキルID・スキル名・経験年数を縦に積みなおすと以下のようになります。
エンジニアID | エンジニア名 | 所属会社ID | 所属会社名 | スキルID | スキル名 | 経験年数 |
1 | コジマ | 1 | ABC株式会社 | 1 | JavaScript | 2 |
1 | コジマ | 1 | ABC株式会社 | 3 | Python | 1 |
1 | コジマ | 1 | ABC株式会社 | 4 | Perl | 1 |
2 | タナカ | 2 | ZZZ株式会社 | 2 | C# | 1 |
2 | タナカ | 2 | ZZZ株式会社 | 5 | Java | 2 |
これで列の繰り返しがなくなりました。
この状態を第一正規形と言います。
第二正規形
次は主キーの一部に依存するデータを切り出します。
このテーブルの主キーは「エンジニアID」と「スキルID」となります。
この2つが分かれば行を一つに絞り込むことができますね。
主キーの一部に依存するデータを考えていきます。
エンジニアIDに依存するデータ、スキルIDに依存するデータを考えてみると以下のようになりますね。
スキルIDに依存・・・スキル名
エンジニアIDに依存するデータを「エンジニアテーブル」
スキルIDに依存するデータを「スキルテーブル」
として別テーブルに切り出します。
エンジニアID | エンジニア名 | 所属会社ID | 所属会社名 |
1 | コジマ | 1 | ABC株式会社 |
2 | タナカ | 2 | ZZZ株式会社 |
スキルID | スキル名 |
1 | JavaScript |
2 | C# |
3 | Python |
4 | Perl |
5 | Java |
エンジニアID | スキルID | 経験年数 |
1 | 1 | 2 |
1 | 3 | 1 |
1 | 4 | 1 |
2 | 2 | 1 |
2 | 5 | 2 |
そうすると主キーの一部だけに依存するデータを別テーブルに切り出すことができました。
この状態を第二正規形と言います。
第三正規形
第三正規形は主キーじゃない列に依存するデータを切り出します。
第二正規形のエンジニアテーブルを見ると、「所属会社名」が主キーじゃないけど「所属会社ID」に依存していることが分かります。
エンジニアテーブルと別に所属会社テーブルを作成し、切り出してあげることにします。
エンジニアID | エンジニア名 | 所属会社ID |
1 | コジマ | 1 |
2 | タナカ | 2 |
所属会社ID | 所属会社名 |
1 | ABC株式会社 |
2 | ZZZ株式会社 |
(その他は不変のため省略)
これで第三正規形ができました!
補足ですが、
実際は第二正規形までしかできないデータ構造も多くあります。
その場合、第二正規形と第三正規形はおなじものとなります。
さいごに
改めて各用語の説明は以下の通り
各正規形の概要
- 非正規形:正規化していないもの
- 第一正規形:列の繰り返しをなくしたもの
- 第二正規形:主キーの一部に依存するデータを別テーブルに切り出したもの
- 第三正規形:主キーじゃない列に依存するデータを別テーブルに切り出したもの
そして、正規化の流れは以下のようになります。
- 列の繰り返しをなくす(第一正規形)
- 主キーの一部に依存するデータを探し、別テーブルに切り出す(第二正規形)
- 主キーじゃない列に依存するデータを探し、あれば別テーブルに切り出す(第三正規形)
このように正規化をする際にはどの列がどの列に依存しているかということを意識することが大切です。
基本情報の問題とかにも出てくるので、ぜひマスターしておきましょう。
なんで正規化するの?正規化するメリットってなーに?みたいな話はまた別の機会に。
この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!
システムエンジニアのつらい部分のあるあるなんかをエンタメにしたチャンネルを作りました。
チャンネルはこちら
つらい部分も楽しくなればと思っているのでよかったらチャンネル登録や高評価してくれたらうれしいです。
以上、コジマでした。