【DB】第1正規形と第3正規形は覚えられるんだけど第2正規形だけ忘れるので整理してみた
おはようございます。タカヒデです。
皆さん、「第2正規形を説明して」と言われて説明できますか?
私はできません。
「第1正規形」と「第3正規形」。
こっちは基本情報でも勉強したので、何となく説明できるんですよ。
しかし「第2正規形」。
こっちは勉強したはずなのに説明できません。覚えていません。
「んー。なんだっけ?」
いまこんな状態です。
というわけで、本日は「データベース設計における正規形について記事にすることで第2正規形も頭に定着化させよう」という記事です。
- データベース設計における正規形の基本的な考え方を学びたい
- 私のように第2正規形を忘れてしまっている
こんな方の参考になれば幸いです。
そもそも正規形とは?
では、これから正規形について理解を深めていくのですが、そもそも正規形とは何でしょうか?
「達人に学ぶDB設計徹底指南書」では正規形について以下のように表現をしています。
正規形とは、一言で言うと、データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式です。
うーん。分かるような分からないような。
もうちょっと砕いて言うと、「データの重複を無くして、シンプルで更新しやすいデータにしようぜ」って話です。
ちなみに正規形のレベルとしては第5正規形まであるようです。
ただ、実務としては第3正規形まで達成すれば第4、第5の条件も満たしていることがほとんどのようですので、ここでは第3正規形までを解説します。
第1正規形とは?
私が覚えたいのは「第2正規形」ですが、理解しやすくするために「第1正規形」から順番に見ていきます。
まず第1正規形とは「1つのセルには1つの値だけを入れろー」っていうものです。
例えば↓のような「社員のプロジェクトデータ」があったとします。
■NGな例

このように、マリオ社員は「ピーチ奪還」と「トレーニング」の2つのプロジェクトを1つのセルに入っている状態のため第1正規形とは言えません。
これでは、データ上で「トレーニング」だけを削除したり、「ピーチ奪還」だけを検索したり、ということが上手くできないデメリットがあります。
ではこれを正規形に直していきます。
■第1正規形(パターン①)

アイテムの列を増やしたことで「1つのセルに1つの値」が守れています。
■第1正規形(パターン②)

同じように、マリオ社員の行数を増やすことで「1つのセルには1つの値」が守れました。
どちらのパターンも第1正規形の形ができていますが、一般的にパターン②の形が使われることが多いようです。
これが第1正規形です。
第2正規形とは?
続けて本題、「第2正規形」を見ていきましょう。
第2正規形は「部分関数従属」と呼ばれます。
難しい言葉が出てきましたね。
噛み砕いていうと、「主キーが2つ以上あるとき、1つで決まる情報は分けろー」って感じです。
分かりづらいですね。
具体例で見ていきましょう。
今回は「社員データ」です。
■NGな例

このテーブルの主キーは「会社コード」と「社員コード」です。
そのためすべての列は「会社コード」と「社員コード」に紐づいています。
1行のレコードを特定できるキー(複数の列で主キーとなる場合もある)
しかし、「会社名だけは会社コードのみ」に紐づいており、「社員コードは不要」です。
こんな情報は分けろーって言っているのが第2正規形です。
ではこのデータを第2正規形にしていきましょう。
■第2正規形

やっていることは「会社コード」「会社名」を別のテーブルに切り出したことです。
やっていることは簡単ですね。
これをしなければ、「新たにT商事を追加したいけど社員データが分からないから追加できないー」となってしまうデメリットがあるのです。
これが第2正規形です。
第3正規形とは?
最期に第3正規形も見ておきましょう。
第3正規形は「推移的従属」と呼ばれます。
これも分かりにくいですね。。
こちらも噛み砕くと、「非キー列が、別の非キー列に依存する状態をなくせー」って感じです。
先ほど作成した第2正規形のデータを第3正規形にしていきましょう。
■第2正規形

第3正規形にする上でのポイントは主キー以外である、「部課コード」と「部課名」です。
新たな部課名を登録しようと思ったら、「会社コード」・「社員コード」→「部課コード」→「部署名」という段階を踏んで登録せねばなりません。
そうならないように部課データを切り出すのが第3正規形です。
■第3正規形

第2正規形の時と同じように、「部課コード」と「部課名」を別のテーブルに切り出します。
これで「非キー列が、別の非キー列に依存する状態」が無くなりました。
例えば「新たに人事部が作られた!」とか「営業部が法人営業部に名前が変わった!」とかなっても部課データだけを更新すればよいので、更新や変更に強いデータ設計ができたわけですね。
なぜ第2正規形を覚えられないのか
あらためてこの記事を作成してみて認識しましたが、私の理解はあくまで「試験に合格するための理解」でした。
- 第1正規形:一つのセルには一つの値
- 第3正規形:コードと名前が重複しているものは切り出す
こんな曖昧な理解をしていたので第2正規形が分からなくなっていたんでしょうね。
また、第1正規形や第3正規形は基本情報の練習問題とかでも出てくるんですが、第2正規形ってあまり出てこないために理解が曖昧のまま進めてしまっていたのかと思います。
皆さんはぜひ、第1正規形から段階を踏んで、「なぜその正規形が必要なのか?」ということを意識して学んでください。
まとめ
以上が「データベース設計における正規形について記事にすることで第2正規形も頭に定着化させよう」という本日の記事でした。
- 第1正規形
- 1つのセルには1つの値だけを入れる
- 第2正規形
- 主キーが2つ以上あるとき、1つで決まる情報は分ける
- 第3正規形
- 非キー列が、別の非キー列に依存する状態をなくす
そんなん当たり前じゃい。って方もいるかもしれませんが、温かく見守ってください。
お疲れさまでした。
