情報からテーブル作成をする場合、「正規化」という考え方があります。ここでは「第一正規化」について扱います。
※第一正規化より先はある程度複雑な業務などを扱うプロジェクトでないといまいちイメージが出来なかったため割愛させてください。
第一正規化とは
テーブル定義を行ったときに同じ情報「名称など」を繰り返し扱うことがあります。このような情報をグループごとにテーブル化することを言います。
正規化を行うと、データの冗長性、不整合が抑止できると考えております。
例えば同じ名称を繰り返しテーブルに追加していくと登録する文字列に間違いが生じることが予測されます。文字列に間違いが生じると本来同じ意味であった情報が違うものとして扱われてしまいます。このような状態を事前に抑止できるように正規化は行っておいた方がよいと思います。
それでは、以下のテーブルを正規化してみます。
※テーブル作成については別途記載しております。
No. | 艦名 | 艦種 | 進水日 |
1 | 大和 | 戦艦 | 1940年8月8日 |
2 | 赤城 | 空母 | 1925年4月22日 |
3 | 五月雨 | 駆逐艦 | 1935年7月6日 |
4 | 朝霜 | 駆逐艦 | 1943年7月18日 |
正規化しないでテーブル定義をした場合は以下の通りです。
テーブル名:WARSHIP
No. | カラム名 | データ型 | 主キー |
1 | ID | NUMERIC(5) | 〇 |
2 | NAME | VARCHAR(100) | |
3 | TYPE | VARCHAR(50) | |
4 | LAUNCH_DATE | DATE |
グループを抜き出してテーブル化
上記情報では、「艦種」の項目に重複した情報が存在することが分かります。この艦種だけでテーブルを作成することを考えます。
テーブル名:WARSHIP_TYPE
No. | カラム名 | データ型 | 主キー |
1 | ID | NUMERIC(2) | 〇 |
2 | NAME | VARCHAR(50) |
元のテーブル構成を変更
元のテーブルから「艦種」項目に新しく追加したテーブル「WARSHIP_TYPE」を参照する「ID」の項目「WARSHIP_TYPE_ID」に変更します。
テーブル名:WARSHIP
No. | カラム名 | データ型 | 主キー |
1 | ID | NUMERIC(5) | 〇 |
2 | NAME | VARCHAR(100) | |
3 | WARSHIP_TYPE_ID | NUMERIC(2) | |
4 | LAUNCH_DATE | DATE |
この形が「第一正規化」を実施した形になります。
正規化後のテーブルにデータを登録
実際に正規化したテーブルにデータを配置します。
テーブル名:WARSHIP_TYPE
ID | NAME |
1 | 戦艦 |
2 | 空母 |
3 | 駆逐艦 |
4 | 海防艦 |
※「4:海防艦」は、参照するときの説明にあると便利かなと思い追記しました。
テーブル名:WARSHIP
ID | NAME | WARSHIP_TYPE_ID | LUNCH_DATE |
1 | 大和 | 1 | 1940年8月8日 |
2 | 赤城 | 2 | 1925年4月22日 |
3 | 五月雨 | 3 | 1935年7月6日 |
4 | 朝霜 | 3 | 1943年7月18日 |
このような形でデータ登録を行います。この分割したテーブルをもとの情報と同じように参照する方法については下記を参照してください。