テーブルの正規化

正規化の目的

テーブル内の重複する項目を排除し、システムにおけるデータ登録または、データ更新時にデータの不整合が起きないようにする。

なお、正規化をすることで1つの大きなテーブルが複数の小さなテーブルへ分離されるため、データの読み込みでは複数のテーブルを結合して、データの読み込みを行うこととなる。
そのため、正規化をすることで、データの読み込みにおいてパフォーマンスが劣化する場合がある。

第1正規形

1.テーブルの1行の任意の項目が複数の要素を持つ場合は、1要素あたり1行となるように行を分離する
(例)

伝票No 購入商品 合計金額
1 ナルト、ヒロアカ、ワンピース 1350

↓正規化後

伝票No 伝票詳細No 購入商品 合計金額
1 1 ナルト 1350
1 2 ヒロアカ 1350
1 3 ワンピース 1350

正規化前のテーブルでは、伝票Noに対して複数の購入商品が対応していたが、正規化後は伝票Noと伝票詳細Noの2つの項目から購入商品を一意に特定できるようになった。

2.テーブルのカラムから同一の項目を設定するカラムを排除する
(このパターンは、そのままでも第1正規形を満たしているが、拡張性が悪いため、データを行で持つように変換している)
(例)

伝票No 購入商品1 購入商品2 購入商品3 合計金額
1 ナルト ヒロアカ ワンピース 1350

↓正規化後

伝票No 伝票詳細No 購入商品 合計金額
1 1 ナルト 1350
1 2 ヒロアカ 1350
1 3 ワンピース 1350

正規化前のテーブルでは、購入商品を複数のカラムで管理していたが、正規化後は購入商品1、購入商品2、購入商品3の各カラムを購入商品という1つのカラムにまとめている。
また、カラムを1つにまとめるたことで、購入商品を複数の行で管理することとなった。
そのため、伝票Noだけでは、購入商品を一意に特定できなくなったため、伝票詳細Noを追加している。

※購入商品1、購入商品2、購入商品3のようなカラムの持ち方をした場合、1回で購入できる商品の数の変更などの仕様変更のたびにテーブルを変更する必要がある。
結果として、同一項目を複数カラムで管理する設計とした場合は、拡張性の低いシステムとなる。

そのため、基本的にはテーブルの設計をする場合は、重複データはカラムではなく行で持つように設計する。

第2正規形

部分キーによる関数従属をなくす

(例)

伝票No 伝票詳細No 購入商品 合計金額
1 1 ナルト 1350
1 2 ヒロアカ 1350
1 3 ワンピース 1350

↓正規化後

伝票No 合計金額
1 1350
伝票No 伝票詳細No 購入商品
1 1 ナルト
1 2 ヒロアカ
1 3 ワンピース

正規化前のテーブルでは、伝票Noと伝票詳細Noの2つの項目が分からなければ、購入商品が一意に特定できなくなっている。
しかし、合計金額は伝票Noが同一の値であれば、伝票詳細Noの値にかかわらず同一の値となっている。

このように、値が一意に決まる条件が異なる項目が同一テーブルに存在する場合は、テーブルを分ける必要がある。
なお、第2正規形では、主キーの一部の項目から一意に特定できる項目を別のテーブルへ分けるようにする。
そして、上記の正規化前のテーブルでは、主キーは伝票Noと伝票詳細Noの2項目となる。
そのため、伝票Noのみで項目が特定できる合計金額を正規化後では別テーブルに分離している。

また、第2正規形への正規化をするためには、主キーが決められている必要がある。
そのため、第2正規形への正規化の前に、主キーを決める必要がある。

主キーとは

主キーは、テーブルの中で、行を一意に特定できる1つまたは複数の項目である。
そして、行を一意に特定するための項目となるため、null値の登録や、主キー項目内でのデータ重複は許されない。

第3正規形

非キー項目による関数従属をなくす

(例)

伝票No 購入者 年齢 合計金額
1 山田 ○太郎 24 1350

↓正規化後

伝票No 購入者No 合計金額
1 0001 1350
購入者No 購入者 年齢
0001 山田 ○太郎 24

正規化前のテーブルでは、伝票Noから購入者、購入者の年齢、購入した商品の合計金額が一意に特定できるようになっている。
しかし、購入者の年齢は、購入者が特定できることで一意に特定できる項目となっている。

つまり、購入者の年齢は、主キー以外の項目(非キー項目)から一意に特定できる項目となっている。
そのため、購入者と購入者を別テーブルに分離し、非キー項目から一意に特定できる項目がテーブル内に存在しないようにする。

テーブル設計に関する書籍

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

グラス片手にデータベース設計 ~会計システム編 (DB Magazine Selection)

グラス片手にデータベース設計 ~会計システム編 (DB Magazine Selection)

グラス片手にデータベース設計~生産管理システム編 (DB Magazine Selection)

グラス片手にデータベース設計~生産管理システム編 (DB Magazine Selection)