ERD設計におけるデータベース正規化

ER図設計時にデータベース正規化の原則(第1正規形から第3正規形)を適用する方法。冗長性、部分従属、推移従属の識別と排除を学びます。

Design Patterns

詳細な説明

正規化とは?

データベース正規化は、データの冗長性を削減データの整合性を向上させるためにデータベーススキーマを整理するプロセスです。テーブルをより小さく、よく構造化されたテーブルに分解し、それらの間のリレーションシップを定義します。目標は、すべてのデータが正確に1か所に保存されるスキーマです。

第1正規形(1NF)

テーブルが1NFにある条件:

  • すべてのカラムがアトミック(分割不可能)な値を含む
  • 繰り返しグループや配列がない

違反:

id name phone_numbers
1 Alice 555-0001, 555-0002

修正: 1対多リレーションシップで別のphone_numbersテーブルを作成。

第2正規形(2NF)

テーブルが2NFにある条件:

  • すでに1NF
  • すべての非キーカラムが主キー全体に依存(部分従属なし)

これは複合主キーを持つテーブルに関連します。

違反: PK (student_id, course_id)を持つテーブルで、カラムstudent_namestudent_idのみに依存し、完全なキーには依存しない。

修正: student_namestudentsテーブルに移動。

第3正規形(3NF)

テーブルが3NFにある条件:

  • すでに2NF
  • 非キーカラムが他の非キーカラムに依存しない(推移従属なし)

違反:

id department_id department_name

department_namedepartment_idに依存し、idに直接依存しない。

修正: 別のdepartmentsテーブルを作成し、外部キーで参照。

ERD設計での正規化

ERDを設計する際:

  1. すべてのデータを含む単一エンティティから始める
  2. 繰り返しグループを識別 → 1:Nリレーションシップで新しいエンティティに抽出
  3. 複合キーを確認 → 非キーカラムが完全なキーに依存することを確認
  4. 推移従属を識別 → ルックアップ/参照テーブルに抽出

いつ非正規化するか

パフォーマンス要件が意図的な非正規化を正当化することがあります:

  • 計算値のキャッシュ(例:order_total
  • 読み取り重視のシステムでJOIN多用クエリの削減
  • 時系列や分析テーブル

重要なのは、最初に正規化し、明確なドキュメントとともに戦略的に非正規化することです。

ユースケース

冗長性とデータ整合性の問題についてデータベース設計をレビューしている場合。ERD設計段階で正規化を適用することで、テーブルが作成されたりデータが挿入される前に構造的な問題を早期に発見できます。

試してみる — ERD Editor

フルツールを開く