データをどのように保存するかを決めることをテーブル設計といいます。また、テーブルに無駄なデータを持たないようにテーブルを分けることを正規化といいます。今回はテーブル設計の基本と正規化について紹介します。
テーブル設計について
テーブル設計の基本
テーブル設計を行う上で必要な4つのポイントについて紹介します。
・エンティティ
データベース設計の対象業務において、管理すべき情報のことをエンティティといいます。管理すべき情報(エンティティ)を洗い出しすことで、設計ミスや手戻りのリスクを軽減し、効率よく品質の高いデータベースを設計することが可能になります。
たとえば、対象業務が販売管理の場合、顧客/商品/契約/注文/請求/在庫などがエンティティにあたります。”「顧客」が「商品」を購入する”という場合は、「顧客」と「商品」がエンティティです。
また、エンティティはデータベースに含まれるテーブルのことを指します。
・属性
あるエンティティに従属する項目のことを属性といいます。「従属する項目」とは、「エンティティを1つに定めたときに、一緒にわかる情報」のことで、たとえば、通販の商品カタログから欲しい商品を1つ選ぶとします。
この際、「商品名」や「価格」も同時に分かりますが、このような「商品」というエンティティに対し、一緒にわかる「商品名」や「価格」のような情報を属性と呼びます。
また、属性はデータベース上のテーブルが持つフィールドのことを指します。
・リレーション
結び付きのあるエンティティ同士を関連させるものを関係(リレーション)といいます。対象が顧客との契約を管理する業務の場合は、エンティティである「顧客」と「契約」同士が関係(リレーション)している状態です。リレーションは、データベースに含まれるテーブルとテーブルをつなぐ共通の項目を指します。
・関連の多重度
関連のあるエンティティ同士の相対的な位置付けをより明確にするためのものを多重度といいます。関連の多重度はデータベース設計4大要素のなかでも、一番重要な要素と言っても過言ではありません。
相対的な位置づけとは、片方から他方を見たときに「相手が1つなのか、複数なのか」ということです。
発生する多重度のパターンに応じて、データベース設計時に考慮するべきエンティティが変わります。エンティティの考慮漏れが発生すると、データベース上でプロセスを表現できない場合があるため、多重度を決定するための過程は、エンティティの位置付けを明確にさせ、エンティティの抽出漏れを防ぐことにつながります。
正規化
データベースの正規化とは、データベース設計の工程において同一テーブル内のデータの重複をなくすために、適宜データを分割・整理することです。
下記、正規化前のテーブルと正規化後のテーブルになります。
studentsテーブル(正規化前)
| id | name | club |
| 1 | 山田 | 野球 |
| 2 | 田中 | サッカー |
| 3 | 佐藤 | サッカー |
| 4 | 高橋 | バスケットボール |
studentsテーブル(正規化後)
| id | name | club_id |
| 1 | 山田 | 1 |
| 2 | 田中 | 2 |
| 3 | 佐藤 | 2 |
| 4 | 高橋 | 3 |
clubsテーブル(正規化後)
| id | name |
| 1 | 野球 |
| 2 | サッカー |
| 3 | バスケットボール |
| 4 | バレーボール |
clubテーブルを作成し、部活のデータをまとめることでデータの不整合が生じにくくなります。下記3つを行うことによって。テーブルの正規化を行うことができます。テーブル構成に正解はないので、一般的な一例として捉えてください。
第一正規形 → 同一行内での繰り返しを無くす
第二正規形 → 部分関数従属性を無くす
第三正規形 → 推移関数従属性が存在しない状態にする
エンジニアからのアドバイス
実際の開発では、どんな形でデータが挿入、参照されるかによって最適なデータベース設計は異なります。ですが、どんなシステムでもデータベース設計において正規化の知識は活かすことができます。不整合が起きにくく、データ管理がしやすいデータベース設計を心がけましょう。
