データベースの正規化とは、データの重複や矛盾が生じないようにすることに加え、テーブルを再利用しやすくするためのデータベース設計手法です。
リレーショナル・データベースにおけるテーブルを正規化する手順を紹介します。
第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正規化では、部分従属する属性を他のテーブルに分離する。
一方の値が決まると、他の項目も一意に決まる関係を関数従属性という。関数従属性のうち、すべての主キーの組み合わせから値が決まる関係を完全従属といい、主キーの一部で値が決まる関係を部分従属という。
第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正規化では、テーブルの中にある推移従属関係属性を他のテーブルに分離して、すべての属性が主キーに対して完全従属であるテーブルにする。主キー以外の属性に従属する関係を推移従属関係という。
第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 | 日用品 |