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_nameがstudent_idのみに依存し、完全なキーには依存しない。
修正: student_nameをstudentsテーブルに移動。
第3正規形(3NF)
テーブルが3NFにある条件:
- すでに2NF
- 非キーカラムが他の非キーカラムに依存しない(推移従属なし)
違反:
| id | department_id | department_name |
|---|
department_nameはdepartment_idに依存し、idに直接依存しない。
修正: 別のdepartmentsテーブルを作成し、外部キーで参照。
ERD設計での正規化
ERDを設計する際:
- すべてのデータを含む単一エンティティから始める
- 繰り返しグループを識別 → 1:Nリレーションシップで新しいエンティティに抽出
- 複合キーを確認 → 非キーカラムが完全なキーに依存することを確認
- 推移従属を識別 → ルックアップ/参照テーブルに抽出
いつ非正規化するか
パフォーマンス要件が意図的な非正規化を正当化することがあります:
- 計算値のキャッシュ(例:
order_total) - 読み取り重視のシステムでJOIN多用クエリの削減
- 時系列や分析テーブル
重要なのは、最初に正規化し、明確なドキュメントとともに戦略的に非正規化することです。
ユースケース
冗長性とデータ整合性の問題についてデータベース設計をレビューしている場合。ERD設計段階で正規化を適用することで、テーブルが作成されたりデータが挿入される前に構造的な問題を早期に発見できます。