今回はデータベース設計について学んだことをまとめます。
特に実務でも必ず使う論理設計と正規化に重点を置き、初心者でもイメージしやすいように解説できたらと考えています。
1. DB設計の全体像
DB設計は、ざっくり以下3つのステップで進めます。
1-1. 概念設計
・扱う情報や関係性を明確にする
・ER図(Entity Relationship Diagram)で表す
例:ユーザーが商品を注文する → 「ユーザー」「注文」「商品」というエンティティを洗い出す
1-2. 論理設計
・データをRDB(リレーショナルデータベース)で使える形に変換
・主キー、外部キー、正規化を行う
1-3. 物理設計(実際のDB実装の準備)
・データ型やインデックス設計
・DBMSごとの最適化
【ポイント】
概念設計は「何を扱うか」、論理設計は「どう整理するか」、物理設計は「どう動かすか」
2. 論理設計の基本
論理設計は、データを重複が少なく矛盾が起きにくい形に整理する作業です。
2-1. 主キー(Primary Key)
・各行を一意に識別するためのキー
・重複やNULLは禁止
例:user_id、order_id
2-2. 外部キー(Foreign Key)
・他のテーブルの主キーを参照するカラム
・データの関係性を保つ
例:orders.user_id → users.user_id
2-3. データ型の選択
・正しい型を選ぶことで性能や整合性が上がる
・数値はINTやBIGINT、日付はDATEやDATETIME
例:ユーザーと注文の関係
テーブル : users
・user_id (PK)
・name
・email
テーブル : orders
・order_id (PK)
・user_id (FK → users.user_id)
・order_date
3. 正規化の基本
正規化とは、冗長性を減らし整合性を保つためにテーブルを分割する作業です。
一言で言うと「意味ごとにテーブルを分けて整理する」ことです。
第1正規形(1NF)
・各カラムには1つの値だけを入れる
・繰り返しカラムを作らない
第2正規形(2NF)
・複合キーの一部にだけ依存する列を分ける
・主キーが2つ以上のカラムで構成されている場合に注意
例: (order_id, product_id) が主キーで、order_dateはorder_idだけで決まる場合、order_dateは別テーブルに分離する
第3正規形(3NF)
・主キー以外の列同士の依存を排除
例:住所テーブルに郵便番号から都道府県が決まる場合、都道府県は郵便番号から導けるため別テーブルに分離する
4. 正規化のメリットとデメリット
【メリット】
・データの重複削減
・更新時の整合性維持
・論理的な整理による可読性向上
【デメリット】
・JOINが多くなり、性能が落ちる可能性がある
・過度な分割は管理が複雑
実務では第3正規形まで行い、必要に応じて非正規化するのが一般的です。
5. 論理設計・正規化を学んで気づいたこと
・最初にしっかり設計すれば、後からの修正コストが大幅に減る
・正規化は理屈だけでなく、サンプルを作って試すと理解が深まる
・ER図を描くと頭の中が整理される
・完璧な正規化は不要で、システムの性質や速度も考慮が必要になる
6. まとめ
・論理設計は「データを整理する技術」
・正規化は「冗長性をなくし整合性を保つ方法」
・実務では正規化とパフォーマンスのバランスが重要
・最初の設計が後の保守性を左右する
参考資料
・書籍「達人に学ぶDB設計徹底指南書」