DB設計~第一正規化から第三正規化

はじめに

商品の注文履歴テーブルを作成する、という題材でDB設計(第一正規化から第三正規化まで)を考えていきます。
カラムは簡潔にするためにシンプルにしています。

第一正規化

これは単に一つのカラムに一つの値が入っている状態で、以下のような形です。
注文履歴テーブル

注文ID 注文者ユーザーID 注文者名 注文日 商品ID 商品名 商品価格 商品カテゴリーID 商品カテゴリー名
15 2 山田太郎 2021-01-02 10:00:00 2102 鉛筆 100 001 文具

良くないケース

第一正規化に見せかけてカンマで値を入れているDBを2回くらい見たことがありますが、設計も実装も辛くなるので止めた方が良いと思います。

商品IDリスト
2,3,5,6

↑のような形で、データを取得するときはサーバーサイドでFor文で回して取っちゃうやつ。

第二正規化

テーブルの主キー(プライマリーキー)と、それに従属する値の関係にテーブルを分割します。
考え方としては、それぞれ関係している情報を別テーブルに切り出す感じでしょうか。
今回だと、注文履歴に関する情報、ユーザーに関する情報、商品に関する情報は
それぞれ切り出しています。
また、商品名は商品IDがあれば引っ張ってこれる(IDでJoinして取得)から注文履歴テーブルに商品名はいらないな、といった考え方をしています。

注文履歴テーブル

注文ID 注文者ユーザーID 注文日 商品ID
15 2 2021-01-02 10:00:00 2102

ユーザーテーブル

ユーザーID ユーザー名
2 山田太郎

商品テーブル

商品ID 商品名 商品価格 商品カテゴリーID 商品カテゴリー名
2102 鉛筆 100 001 文具

第三正規化

第二正規化か終わっても、まだ十分ではありません。
商品テーブルに着目します。
商品カテゴリIDが分かれば商品カテゴリ名が分かるのにも関わらず、テーブルが分かれていません。
テーブルが分かれていないと何が問題かというと、後々商品カテゴリの名前が変更されたときに 商品テーブルの商品カテゴリ名もすべて更新する必要があります。
商品カテゴリーテーブルを作成し、商品カテゴリIDだけ持っていれば、商品カテゴリーテーブルの商品カテゴリー名を一つ変更するだけで済みます。
また、今後商品カテゴリに基づく情報が増えた時に、テーブルを分けておくと管理しやすくなります。

商品テーブル

商品ID 商品名 商品価格 商品カテゴリーID
2102 鉛筆 100 001

商品カテゴリーテーブル

商品カテゴリーID 商品カテゴリー名
001 文具

以上で第三正規化までのDB設計を行うことが出来ました。