SQL Serverのデータベース設計で正規化:データの冗長性を排除し、一貫性を保つための正規化の各段階

データベース設計において、データの冗長性を排除し、一貫性を保つことは非常に重要です。そのための重要な手法の一つが「正規化(Normalization)」です。

正規化とは、データの整合性を確保し、更新時の異常(Update Anomaly)を防ぐために、データを適切な形に分割して管理する手法です。

本記事では、SQL Server におけるデータベース設計を前提とし、第一正規形(1NF)から第五正規形(5NF) までの各段階について詳しく解説します。また、最後に演習問題とその解答例も紹介します。


正規化の目的

データベースの正規化を行う主な目的は以下の通りです。

  1. データの冗長性を排除
    • 同じデータが複数の場所に保存されることを防ぎ、ストレージの効率を向上させる。
  2. データの整合性を維持
    • 更新、削除、挿入時の矛盾を防ぐ。
  3. データの一貫性を確保
    • 異なるテーブル間で不整合が生じないようにする。
  4. クエリのパフォーマンスを向上
    • 適切なインデックスや結合の利用により、検索速度を向上させる。

正規化の各段階

第一正規形(1NF:First Normal Form)

定義
  • 各カラムの値は原子性(Atomicity) を持つ(つまり、値は分割できない単一の値である)。
  • 各レコードはユニークであり、主キー(Primary Key) が定義されている。
非正規化の例
ID氏名電話番号
1田中太郎090-1234-5678, 080-9876-5432
2鈴木一郎070-1111-2222
1NFに正規化
ID氏名電話番号
1田中太郎090-1234-5678
1田中太郎080-9876-5432
2鈴木一郎070-1111-2222

👉 複数の電話番号を分割し、各カラムの値を単一化。


第二正規形(2NF:Second Normal Form)

定義
  • 1NFを満たしていること
  • 主キーに部分関数従属(Partial Dependency)がないこと(主キーの一部にのみ依存するカラムを分離する)。
非正規化の例(1NFの状態)
ID氏名商品ID商品名価格
1田中太郎P001ノートPC100,000
1田中太郎P002マウス3,000
2鈴木一郎P001ノートPC100,000
2NFに正規化
顧客情報テーブル
ID氏名
1田中太郎
2鈴木一郎
商品情報テーブル
商品ID商品名価格
P001ノートPC100,000
P002マウス3,000
購入履歴テーブル
ID商品ID
1P001
1P002
2P001

👉 顧客情報と商品情報を分離し、主キーの一部にのみ依存する属性を排除。


第三正規形(3NF:Third Normal Form)

定義
  • 2NFを満たしていること
  • 推移的関数従属(Transitive Dependency)がないこと(主キー以外のカラムが、別の非キー属性に依存していない)。
非正規化の例(2NFの状態)
商品ID商品名価格メーカーIDメーカー名
P001ノートPC100,000M001A社
P002マウス3,000M002B社
3NFに正規化
商品情報テーブル
商品ID商品名価格メーカーID
P001ノートPC100,000M001
P002マウス3,000M002
メーカー情報テーブル
メーカーIDメーカー名
M001A社
M002B社

👉 メーカー名を別テーブルに分離し、冗長性を排除。


ボイス・コッド正規形(BCNF: Boyce-Codd Normal Form)

定義
  • 3NFを満たしていること
  • 主キー以外の候補キー(Candidate Key)が、主キーに依存していない。

第四正規形(4NF:Fourth Normal Form)

定義
  • BCNFを満たしていること
  • 多値従属(Multivalued Dependency)を排除すること

第五正規形(5NF:Fifth Normal Form)

定義
  • 4NFを満たしていること
  • データを適切に分割し、結合依存(Join Dependency)を排除すること

演習問題と解答例

問題

以下の非正規化テーブルを3NFまで正規化してください。

注文ID顧客名商品ID商品名メーカー名
O001田中P001ノートPCA社
O001田中P002マウスB社
O002鈴木P003キーボードB社

解答

顧客テーブル
顧客ID顧客名
C001田中
C002鈴木
商品テーブル
商品ID商品名メーカーID
P001ノートPCM001
P002マウスM002
P003キーボードM002
メーカー情報テーブル
メーカーIDメーカー名
M001A社
M002B社
注文履歴テーブル
注文ID顧客ID商品ID
O001C001P001
O001C001P002
O002C002P003

👉 3NFに正規化完了!