BETA

DBの第1正規形・第2正規形・第3正規形について簡単にまとめてみた

投稿日:2020-02-02
最終更新:2020-02-02

はじめに

DBの第1正規形・第2正規形・第3正規形について、簡単にまとめます。

第1正規形

第1正規形とは、1つのセルに1つのデータのみが格納されている状態のことです。
とある企業の顧客テーブルを以下のように設定するとします。この顧客テーブルは、1つのセルに1つのデータのみが格納されているので、第1正規形と言えます。

顧客テーブル

会社コード 会社名 社員id 社員名 メールアドレス 部署コード 部署名
C001 A製鋼 1 さとし [email protected] D01 人事部
C002 B株式会社 2 たけし [email protected] D02 技術部
C003 C商事 3 むさし [email protected] D03 総務部
C002 B株式会社 4 ひとし [email protected] D04 営業部
C001 A製鋼 5 あつし [email protected] D03 総務部

第2正規形

第2正規系とは、テーブルのすべての主キーにおいて部分関数従属性が存在しない状態のことです。

主キー?部分関数従属?

主キーとは、レコードを一意に定めるキー(項目)のことです。
上記の顧客テーブルというと、{会社コード, 社員id}ですね。
なぜなら、

  • 会社コードが定まると、会社名が一意に決まる
  • 社員idが定まると、社員名、メールアドレス、部署コード、部署名が一意に決まる

からです。
ちなみに、主キー以外のキー(ここでいうと会社名、社員名、メールアドレス、部署コード、部署名)を非キーといいます。

部分関数従属とは、主キーの一部で他の項目が決まってしまう状態のことです。
例えば、社員id(主キー)がわからなくても会社コード(主キー)がわかれば会社名は決められるし、会社コード(主キー)がわからなくても社員id(主キー)がわかれば社員名は決められますよね。
このように、片方の主キーだけで決まるものがある場合、部分関数従属性があるといいます。

要は、片方の主キーだけで決まる部分を別テーブルに分割したものが第2正規形というわけです。
よって、以下は第2正規形であると言えます。

社員テーブル

社員id 社員名 メールアドレス 部署コード 部署名 会社コード
1 さとし [email protected] D01 人事部 C001
2 たけし [email protected] D02 技術部 C002
3 むさし [email protected] D03 総務部 C003
4 ひとし [email protected] D04 営業部 C002
5 あつし [email protected] D03 総務部 C001



会社テーブル

会社コード 会社名
C001 A製鋼
C002 B株式会社
C003 C商事

第3正規形

第3正規系とは、テーブルのすべての非キーにおいて推移的関数従属性が存在しない状態のことです。

推移的関数従属性?

推移的関数従属とは、非キーの一部で他の項目が決まってしまう状態のことです。
上記の第2正規形におけるテーブルでいうと、部署コード(非キー)が定まると部署名が定まりますよね。このように、非キーの一部で他の項目が決まっているので、上記の第2正規形におけるテーブルは推移的関数従属性が存在すると言えます。

要は、非キーの一部で決まる部分を別テーブルに分割したものが第3正規形というわけです。
よって、以下は第3正規形であると言えます。

社員テーブル

社員id 社員名 メールアドレス 部署コード 会社コード
1 さとし [email protected] D01 C001
2 たけし [email protected] D02 C002
3 むさし [email protected] D03 C003
4 ひとし [email protected] D04 C002
5 あつし [email protected] D03 C001



会社テーブル

会社コード 会社名
C001 A製鋼
C002 B株式会社
C003 C商事



部署テーブル

部署コード 部署名
D01 人事部
D02 技術部
D03 総務部
D04 営業部

終わりに

  • 第1正規形とは、一つのセルに一つのデータのみが格納されている状態
  • 第2正規形とは、部分関数従属性(主キーの一部で他の項目が決まること)が存在している部分を別テーブルに切り出した状態
  • 第3正規形とは、推移的関数従属性(非キーの一部で他の項目が決まること)が存在している部分を別テーブルに切り出した状態

この記事が誰かの参考になれば幸いです。

参考

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@6bcthX7hmSykGRQuの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう