リレーショナルデータベースの設計において、「正規化」という作業は、データの信頼性を高め、更新を効率化するために必要不可欠です。
本記事では正規化の概要や手順について解説していきます。
正規化とは?
データベースの正規化とは、データベース設計の工程において同一テーブル内のデータの重複をなくすために、適宜データを分割・整理することです。
「正規化なし」の例
以下は正規化が行われていない表の例です。
・注文した商品の種類が増えるほど商品情報の列が増える
・同じ商品番号と商品名の組み合わせが複数格納されている
・同じ商品と仕入れ先の組み合わせが複数格納されている
というように、同じ表の中で重複している情報があります。
「正規化あり」の例
以下は、後に説明する手順で正規化を行った表です。一つの表の中に繰り返しがなく、かつ上で示した表と同様の情報を得ることができます。
正規化のメリット
正規化のメリットは「重複を排除することでデータの不整合が起きるリスクを減らせること」です。
たとえば正規化が不十分な以下の表の場合、部署の名前が営業部 → 第一営業部に変更になった際には営業部に所属するすべての社員の行を更新する必要があります。人事異動により部長の名前が変更になった場合も同様です。そしてひとつでも更新が漏れているとデータに矛盾が発生してしまいます。
一方、このように正規化された表の場合、部署名や部長名の変更は部署テーブルの一行だけを更新すればよいので、データに矛盾が発生しにくいです。
正規化のデメリット
では、正規化にはデメリットはないのでしょうか?表を分割することで、データ参照時に結合処理が多く発生します。結果、レスポンスが低下する場合があります。そのためパフォーマンスの要件を満たせない場合、あえてテーブルに冗長性を残してレスポンスを向上させる方法があります。
とはいえ先に書いたように十分な正規化が出来ていないテーブルはデータ更新が非効率になります。正規化をしないという方法は、他の対策を試みてもパフォーマンス要件を満たせなかった場合の最後の手段とするべきでしょう。
正規化の手順
続いて正規化の手順を解説します。よく知られている正規形の定義には第一〜第五正規形、第3.5正規形とも呼ばれるボイス・コッド正規形があります。正規形の数字が大きくなるほど正規化が進んでいます。
実務で使われるのは多くの場合第三正規形までです。そのためこの記事でも第三正規形までの正規化手順を解説します。
正規化の手順 (1)第一正規形
第一正規形では、同一行内での繰り返しをなくします。
以下の表では商品の注文数が増えるごとに列が増え、表が拡大し続けます。そのためリレーショナルデータベースにデータを格納することができません。
そこで「注文明細番号」という項目を追加し、同一行内で繰り返していた注文品目に関する情報を別の行にしています。これで表の列数が定まり、データベースに格納できる形になりました。これが第一正規形です。
正規化の手順 (2)第二正規形
第二正規形では、部分関数従属性をなくします。
データベース設計の際は、目的の行(データ)を識別するための項目である主キーを決めます。主キーが複数あるテーブルにおいて、そのうちの一部のキーだけで決定できる項目がある場合が部分関数従属です。
注文テーブルにおいて「注文品目番号」や「数量」は、「注文番号」「注文明細番号」によって決定されますが、注文者の情報は「注文番号」のみで特定することができます。この場合、注文テーブルの主キーは「注文番号」「注文明細番号」であり、注文者に関する情報は主キーの一部である「注文番号」に部分関数従属しています。このような形の表は、お客様の電話番号などが変わったときにそのお客様の注文の数だけデータ更新が必要になり、非効率です。
そこで注文者の情報を注文番号をキーとする別テーブルに分離します。これで第二正規形となります。
正規化の手順 (3)第三正規形
第三正規形は推移関数従属性が存在しない状態にします。
推移関数従属性とは、テーブル内の一部の項目がキーでない項目によって決定されることです。注文テーブルにおいて商品の情報、仕入先の情報は、主キーである「注文番号」「注文明細番号」ではなく「注文品目番号」のみで決定されます。これが推移関数従属です。
この場合、ある商品の仕入れ先を変更した場合に注文テーブルにて該当商品のすべてのレコードを更新することになり件数が膨大になります。
そこで「注文品目番号」をキーとして商品情報、仕入先情報を別テーブルに分離します。第三正規形の完成です。この時仕入先に仕入先コードを付加して別テーブルにすると、仕入先の名称変更などにも対応しやすくなります。
まとめ
実際のシステムでは、どんな形でデータが挿入、参照されるかによって最適なデータベース設計は異なります。
ですが、どんなシステムでもデータベース設計において正規化の知識は活かすことができます。不整合が起きにくく、データ管理のしやすいデータベースを設計するためには正規化が必要不可欠だからです。ぜひ本記事も参考にしながら正規化の学習を進めてみてください。