MySQLのデータベース設計と正規化理論
優れたデータベース設計は、システムの成功の礎となります。設計が不十分だと、将来的に終わりのない問題を引き起こす恐れがあります。
このレッスンでは、データベース設計の理論と実践について学びます。
1. 学習内容
- データベース設計プロセス
- ER図の設計
- 正規形理論(1NF → BCNF)
- アンチパラダイム設計
- 命名規則
2. 設計プロセス
graph TB
A[Requirements Analysis] --> B[Conceptual Design ER Diagram]
B --> C[Logical Design Table Structure]
C --> D[Physical Design Index/Partition]
D --> E[Implementation and Deployment]
E --> F[Operations and Maintenance Optimization]
3. パラダイム理論
| パラダイム | 要件 | 例 |
|---|---|---|
| 1NF | フィールドはこれ以上分割できない | 電話番号に複数のエントリが存在してはならない |
| 2NF | 部分依存関係の除去 | 主キー以外のフィールドは主キーに完全に依存している |
| 3NF | 推移性の排除 | 非主キーフィールドは、他の非主キーフィールドに依存してはならない |
| BCNF | すべての決定要因が候補キーとなる | 3NFのより厳格な形式 |
▶ 例:3NF 設計
SQL
-- Violation of 3NF (Department name depends on dept_id, not directly on employee id)
CREATE TABLE employees_bad (
id INT PRIMARY KEY,
name VARCHAR(50),
dept_id INT,
dept_name VARCHAR(50) -- Transitive dependency
);
-- ✅ Comply with 3NF
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id)
);
4. アンチパラダイム・デザイン
時には、パフォーマンスを優先するために、あえてルールを破ることもあります。
| シナリオ | アンチパラダイム的アプローチ | 理由 |
|---|---|---|
| 頻繁なJOIN | 冗長なフィールド | JOINの削減 |
| 統計クエリ | 計算列 | リアルタイム計算の回避 |
| レポート | サマリーレポート | クエリの高速化 |
5. 命名規則
| ベストプラクティス | 推奨事項 | 避けるべきこと |
|---|---|---|
| テーブル名 | スネークケース、複数形 | 単数形、キャメルケース |
| フィールド名 | スネークケース | キャメルケース、中国語 |
| 主キー | id | userId |
| 外部キー | table_id | customerId |
| インデックス | idx_table_col | table_col_idx |
6. ER図の設計
erDiagram
CUSTOMERS ||--o{ ORDERS : places
ORDERS ||--|{ ORDER_ITEMS : contains
PRODUCTS ||--o{ ORDER_ITEMS : includes
CUSTOMERS {
int id PK
string name
string email
}
ORDERS {
int id PK
int customer_id FK
decimal amount
date order_date
}
PRODUCTS {
int id PK
string name
decimal price
}
❓ よくある質問
Q 3NFに従う必要はありますか?
A ほとんどの場合、はい。ただし、読み取りが多く書き込みが少ないシナリオでは、正規形から逸脱しても問題ありません。
Q 各フィールドにはどのようなデータ型を使用すべきですか?
A 主キーにはBIGINT、金額にはDECIMAL、日付と時刻にはTIMESTAMP、テキストにはVARCHARを使用してください。
Q テーブル名は単数形にするべきか、複数形にするべきか?
A 「レコードの集合」を示すため、複数形(users、orders)を使用することをお勧めします。
Q 3つの正規形に従う必要はありますか?
A 必ずしもそうとは限りません。高同時アクセス環境でのクエリでは、正規形から逸脱しても構いません。適切な冗長性を設けることで、JOINの回数を減らすことができます。
Q ER図の作成にはどのようなツールが利用できますか?
A MySQL Workbench(フォワードエンジニアリング/リバースエンジニアリング)、draw.io(無料のオンラインツール)、dbdiagram.io(コードからER図を生成)などです。
📖 まとめ
- 設計プロセス:要件 → ER図 → テーブル構造 → インデックス → 展開
- 正規形:1NF(非原子形)→ 2NF(部分依存関係の除去)→ 3NF(推移的依存関係の除去)
- アンチパターン:パフォーマンスのための適切な冗長性
- 命名規則:snake_case、主キーは id、外部キーは table_id
📝 練習問題
-
基本問題(難易度:⭐):ブログシステムのER図を作成してください。
-
応用問題(難易度 ⭐⭐):1NFのテーブルを3NFに正規化せよ。
-
チャレンジ問題(難易度:⭐⭐⭐):ユーザー、商品、注文、支払いの各テーブルを含む、Eコマース用データベースを設計してください。



