テーブルの正規化
正規化の目的
テーブル内の重複する項目を排除し、システムにおけるデータ登録または、データ更新時にデータの不整合が起きないようにする。
なお、正規化をすることで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設計 徹底指南書 初級者で終わりたくないあなたへ
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/16
- メディア: 単行本(ソフトカバー)
- 購入: 21人 クリック: 316回
- この商品を含むブログ (24件) を見る
理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)
- 作者: 奥野幹也
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (20件) を見る
グラス片手にデータベース設計 ~会計システム編 (DB Magazine Selection)
- 作者: 梅田弘之
- 出版社/メーカー: 翔泳社
- 発売日: 2005/07/15
- メディア: 単行本
- 購入: 8人 クリック: 61回
- この商品を含むブログ (18件) を見る
グラス片手にデータベース設計~生産管理システム編 (DB Magazine Selection)
- 作者: 梅田弘之,渡辺時彦,羽田雅一
- 出版社/メーカー: 翔泳社
- 発売日: 2009/03/03
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 6回
- この商品を含むブログ (4件) を見る