見出し画像

【DB設計】正規化とは?第1〜3正規形まで解説

最近業務でもデータベースの設計を行うことが増えてきましたが、ほとんど経験則的にやっているところがあったので、頭の中を整理するためにも改めて正規化についてまとめて言語化してみようと思います。
またこの記事では、一般的にここまで抑えれば問題ないとされる第3正規形まで扱います。

正規化について

正規化とはデータベース設計のプロセスで、データの重複を最小限に抑え、データの整合性と効率性を向上させるための手法です。
正規化は、関連性のあるデータを適切にグループ化し、データの不要な繰り返しを排除することで、データベースの柔軟性を高め、データの保守性や利便性を向上させます。

第1正規形

ここからは正規化のプロセスについて具体的に見ていくために、ECサイトのような注文を管理するテーブルを想定してみます。

山田さんは1回の注文で2つの商品を購入したため、上のテーブルでは商品IDと商品名に2つの値が入ってしまっています。(非正規形)
第1正規形では1つのセルには1つの値しか含まれない状態、つまり繰り返し部分がない状態にする必要があります。

第1正規形

繰り返し部分を切り離して独立させることで第1正規形に正規化しました。

第2正規形

第2正規形では、第1正規形の状態から部分関数従属を除いて完全関数従属の状態にします。

関数従属性

関数従属とはあるXの値を定めると、Yの値が一意に決まる関係のことをいいます。社員番号が「A001」の場合、その社員の名前は「加藤」さんと決まるような関係です。
部分関数従属は、ある属性が複数の主キーのいずれかに関数従属している状態です。

今回の例でいうと、注文詳細テーブルの複合キーの一部である商品IDが決定すれば商品名が決まるところが部分関数従属です。第2正規形ではここを別テーブルに分離させます。

第2正規形

第3正規形

第3正規形では、第2正規形の状態から推移的関数従属を除きます。

推移的関数従属

推移的関数従属は、関数従属が推移的に成立する関係のことです。「Aが決まるとBが決まって、Bが決まるとCが決まる」という関係です。

今回の例でいうと、注文テーブルの注文IDが決まるとユーザーIDが決まり、ユーザーIDが決まるとユーザー名が決まる部分が推移的関数従属です。第3正規形ではここを別テーブルに分離します。

第3正規形

まとめ

非正規形だったテーブルを結果的に4つのテーブルに分割して正規化を行いました。
まとめると以下になります。

第1正規形:繰り返し部分がない状態
第2正規形:第1正規形から部分関数従属を排除
第3正規形:第2正規形から推移的関数従属を排除

正規化は整合性の観点からすればメリットがありますが、テーブル数が増えてSQLのパフォーマンスが低下したり管理が複雑になったりなどデメリットもあるので、要件などに合わせて柔軟に設計することが大切になります。

最後まで読んでいただきありがとうございました!

プラスジャムはWeb制作会社です。
ウェブサイト制作、システム開発、Webマーケティングなど、さまざまな課題解決やアイデアを具現化するWebソリューションを提案・提供しています。

プラスジャムのお問い合わせページへ遷移します

noteでプラスジャムを見つけてくださった方は、お時間あればコーポレートサイトや他の記事もご覧いただければ幸いです。

\コーポレートサイトはこちら/

\関連記事はこちら/

プラスジャム製作開発部メンバーがWeb制作技術を紹介。
案件で実装した機能や自己学習で得た知識を発信していきます。
[今回の記事担当]バックエンドエンジニア k.m