データベース設計において「正規化」は避けて通れない最重要テーマのひとつです。
「第1正規化・第2正規化・第3正規化って何が違うの?」「なぜ正規化が必要なの?」という疑問を持つ方に向けて、この記事ではデータベースの正規化を段階ごとにわかりやすく解説していきます。
データベースの正規化とはテーブル設計の冗長性を排除してデータの整合性を高める手法である
それではまず、データベース正規化の基本的な概念と目的について解説していきます。
データベースの正規化とは、リレーショナルデータベースのテーブル設計において、データの重複(冗長性)を排除し更新異常が発生しにくい設計に整理する手法です。
正規化されていないテーブル設計では、データの追加・更新・削除時に不整合が生じやすく、一箇所を変更すると別の箇所との整合性が崩れる「更新異常」が発生します。
データベース正規化の目的は主に3つです。
①データの重複(冗長性)を排除してストレージを効率化する。②更新異常(挿入異常・更新異常・削除異常)を防止する。③データの一貫性・整合性を維持しやすくする。
これらを段階的に実現するために「第1正規形・第2正規形・第3正規形」という正規化の段階が定義されています。
第1正規化(第1正規形:1NF)
続いては、正規化の最初のステップである第1正規化について確認していきます。
第1正規化の定義
第1正規化(1NF:First Normal Form)はテーブルの各セルに1つの値のみを格納するという最も基本的な正規化です。
1つのセルに複数の値が格納されている状態(繰り返しグループ)を解消し、全ての列が原子値(これ以上分割できない単一の値)のみを持つ状態にします。
第1正規化の例
正規化前:注文ID=001、商品名=「リンゴ,バナナ」(1セルに複数値)
正規化後:注文ID=001・商品名=リンゴ、注文ID=001・商品名=バナナ(行を分割)
1つのセルに複数の値をカンマ区切りで格納するのは第1正規形の違反です。
第2正規化(第2正規形:2NF)
続いては、第2正規化の意味と変換方法について確認していきます。
第2正規化の定義
第2正規化(2NF)は第1正規形を満たした上で主キー全体に依存しない「部分関数従属」を解消する正規化です。
複合主キー(2つ以上の列で構成される主キー)を持つテーブルで、主キーの一部にしか依存しない列が存在する場合に問題が生じます。
第2正規化の例
正規化前:{注文ID, 商品ID}が主キーのテーブルに「商品名」列が存在(商品IDのみに依存)
正規化後:商品テーブル(商品ID・商品名)と注文明細テーブル(注文ID・商品ID・数量)に分離
商品名は商品IDのみで決まるため、注文明細テーブルには持たせず商品テーブルに分離します。
第3正規化(第3正規形:3NF)
続いては、第3正規化の意味と変換方法について確認していきます。
第3正規化の定義
第3正規化(3NF)は第2正規形を満たした上で主キー以外の列を介した「推移的関数従属」を解消する正規化です。
「主キー → 非キー列A → 非キー列B」という依存関係(AがBを決定する関係)が存在する場合に問題が生じます。
第3正規化の例
正規化前:顧客テーブルに「顧客ID・顧客名・郵便番号・住所」が存在(郵便番号が住所を決定)
正規化後:顧客テーブル(顧客ID・顧客名・郵便番号)と郵便番号テーブル(郵便番号・住所)に分離
住所は郵便番号から一意に決まるため、郵便番号テーブルとして独立させます。
正規化のメリットとデメリット
続いては、データベース正規化のメリットとデメリットについて確認していきます。
| 項目 | メリット | デメリット |
|---|---|---|
| データ品質 | 更新異常の防止・整合性の維持 | テーブル数が増えて管理が複雑化 |
| ストレージ | 重複データの削除で効率化 | JOINクエリが増えて複雑化 |
| パフォーマンス | 更新処理が効率的 | 参照時のJOINコストが増加 |
読み取り性能を重視する場合は意図的に非正規化(denormalization)を行い、JOINコストを削減するために冗長性を持たせる設計判断もあります。
正規化の程度はシステムの要件と用途に合わせて判断することが重要です。
まとめ
データベースの正規化は第1・第2・第3正規化の3段階でテーブル設計の冗長性を段階的に排除し、更新異常を防いでデータの整合性を高める手法です。
第1正規化でセルの単一値化、第2正規化で部分関数従属の解消、第3正規化で推移的関数従属の解消というステップで進めます。
正規化のメリットとデメリットを理解した上で、システムの要件に合った適切な正規化レベルを選ぶことが良いデータベース設計の基本でしょう。
まずは第1・第2・第3正規化を確実に理解し、実際のテーブル設計に応用してみてください。