データベースの正規化

データベースの正規化とは、データの重複や矛盾が生じないようにすることに加え、テーブルを再利用しやすくするためのデータベース設計手法です。

リレーショナル・データベースにおけるテーブルを正規化する手順を紹介します。

第1正規化

第1正規化では、導出性属性を削除する。

他の属性から導き出せることを導出性という。たとえば、「単価」、「数量」、「金額」という3つの属性を持つ以下のようなテーブルがあったとする。

売上テーブル
顧客ID 顧客名 商品ID 商品名 種別ID 種別名 単価 数量 金額
1 矢島商店 1 ボールペン 1 事務用品 100 5 500
2 鈴木商会 2 OA用紙 1 事務用品 200 10 2000
1 矢島商店 3 トイレットペーパー 2 日用品 200 5 1000
2 鈴木商会 3 トイレットペーパー 2 日用品 200 10 2000

金額は「単価×数量」の式から導き出せるので、導出性属性であり、削除する。

売上テーブル
顧客ID 顧客名 商品ID 商品名 種別ID 種別名 単価 数量
1 矢島商店 1 ボールペン 1 事務用品 100 5
2 鈴木商会 2 OA用紙 1 事務用品 200 10
1 矢島商店 3 トイレットペーパー 2 日用品 200 5
2 鈴木商会 3 トイレットペーパー 2 日用品 200 10

第2正規化

第2正規化では、部分従属する属性を他のテーブルに分離する。

一方の値が決まると、他の項目も一意に決まる関係を関数従属性という。関数従属性のうち、すべての主キーの組み合わせから値が決まる関係を完全従属といい、主キーの一部で値が決まる関係を部分従属という。

第1正規形の売上テーブルでは、顧客IDと商品IDの2つが主キーである。つまり顧客IDと商品IDの2つでレコードを特定することができる。

売上テーブル
顧客ID 顧客名 商品ID 商品名 種別ID 種別名 単価 数量
1 矢島商店 1 ボールペン 1 事務用品 100 5
2 鈴木商会 2 OA用紙 1 事務用品 200 10
1 矢島商店 3 トイレットペーパー 2 日用品 200 5
2 鈴木商会 3 トイレットペーパー 2 日用品 200 10

顧客IDにより顧客名は一意に決まる(もうひとつの主キーである商品IDは無関係)ので、部分従属であり、別のテーブルに分離する。

顧客テーブル
顧客ID 顧客名
1 矢島商店
2 鈴木商会

同様に、商品IDにより商品名、種別ID、種別名、単価は一意に決まるので、部分従属であり、他のテーブルに分離する。

商品テーブル
商品ID 商品名 種別ID 種別名 単価
1 ボールペン 1 事務用品 100
2 OA用紙 1 事務用品 200
3 トイレットペーパー 2 日用品 200

顧客テーブルと商品テーブルを分離した後の売上テーブルは次のようになる。

売上テーブル
顧客ID 商品ID 数量
1 1 5
2 2 10
1 3 5
2 3 10

第3正規化

第3正規化では、テーブルの中にある推移従属関係属性を他のテーブルに分離して、すべての属性が主キーに対して完全従属であるテーブルにする。主キー以外の属性に従属する関係を推移従属関係という。

第2正規形の商品テーブルのうち、種別名は主キーである商品IDではなく、種別IDに従属する。

商品テーブル
商品ID 商品名 種別ID 種別名 単価
1 ボールペン 1 事務用品 100
2 OA用紙 1 事務用品 200
3 トイレットペーパー 2 日用品 200

種別名は推移従属関係であるため、別のテーブルに分離する。

種別テーブル
種別ID 種別名
1 事務用品
2 日用品

種別テーブルを分離した商品テーブルはつぎのようになる。

商品テーブル
商品ID 商品名 種別ID 単価
1 ボールペン 1 100
2 OA用紙 1 200
3 トイレットペーパー 2 200

したがって、第3正規形のデータは次のとおりとなる。

売上テーブル
顧客ID 商品ID 数量
1 1 5
2 2 10
1 3 5
2 3 10

顧客テーブルは、顧客IDと顧客名の対応を表すマスター・テーブルである。

顧客テーブル
顧客ID 顧客名
1 矢島商店
2 鈴木商会

商品テーブルは、商品IDと商品名等の対応を表すマスター・テーブルである。

商品テーブル
商品ID 商品名 種別ID 単価
1 ボールペン 1 100
2 OA用紙 1 200
3 トイレットペーパー 2 200

種別テーブルは、種別IDと種別名の対応を表すマスター・テーブルである。

種別テーブル
種別ID 種別名
1 事務用品
2 日用品