ソフトウェアアプリケーションを構築する際、基盤となるのはたいていユーザーインターフェースではない。それはデータである。情報をどのように構造化し、関連付け、保存するかが、システム全体のパフォーマンス、スケーラビリティ、保守性を決定する。この構造的計画の中心には、エンティティ関係図(ERD)がある。初心者開発者やデータベース管理者にとって、この図を理解することは選択肢ではなく、必須のスキルである。
ERDは、システムのデータ要件を視覚的に表現したものです。エンティティ(テーブル)、属性(カラム)、それらの間の関係(リンク)を明示します。このガイドでは、ERDとは何か、どのように読み解くか、そしてマーケティングのうわべや誇張に頼らずに効果的に設計する方法について包括的に解説します。

ERDの核心的な構成要素 🔨
図を理解するには、まず用語の意味を把握する必要がある。すべてのERDは、3つの主要な構成要素から構成される。1つでも見落とすと、構造が不安定になる。
- エンティティ: これらは、追跡している対象や概念を表す。データベースの文脈では、エンティティは通常テーブルに直接対応する。例として「顧客」「製品」「注文」などがある。エンティティは通常、長方形で描かれる。
- 属性: これらはエンティティを記述する性質である。テーブル内のカラムになる。たとえば「顧客」エンティティの場合、属性には「名前」「姓」「メールアドレス」などが含まれる。属性は通常、長方形の内側に記載されるか、それに接続される。
- 関係: これが最も重要な部分である。関係は、エンティティどうしがどのように相互作用するかを定義する。データの整合性を保つルールを設ける。関係は、エンティティを結ぶ線で表現される。これらの線には、接続の種類を示すラベルが付くことが多い。
簡単なシナリオを考えてみよう。オンラインストアの場合、商品と人を追跡する必要がある。関係がなければ、データは孤立した状態になる。顧客の記録からは、その人が何を購入したかが分からない。注文の記録からは、誰が注文したかが分からない。ERDがこのギャップを埋める。
基数の理解 🔄
基数とは、あるエンティティのインスタンスが、別のエンティティのインスタンスと何個関係するかを測る指標である。問うべきは「いくつ?」である。これはデータベースの制約の背後にある論理の核となる。
ほぼすべての図で遭遇する3つの主要な基数の種類がある:
- 1対1(1:1): エンティティAの1つのインスタンスが、エンティティBの1つのインスタンスと関係する。例:1人の人が1つのパスポートを持つ。1つのパスポートは1人の人だけに属する。これは一般的なアプリケーションではあまり見られないが、セキュリティや機密データの分離においては頻出する。
- 1対多(1:M): エンティティAの1つのインスタンスが、エンティティBの複数のインスタンスと関係する。例:1人の顧客が複数の注文を出すことができる。1つの注文は1人の顧客に属する。これはウェブアプリケーションで最も一般的な関係の種類である。
- 多対多(M:N): エンティティAの複数のインスタンスが、エンティティBの複数のインスタンスと関係する。例:複数の学生が複数の授業に登録できる。複数の授業に複数の学生が参加できる。物理的なデータベースでは、この関係を解消するために中間テーブルが必要となる。
これらの関係を正しく可視化することで、後でデータの重複やクエリエラーを防げる。多対多の関係を誤って1対多としてモデル化すると、冗長なデータや壊れた外部キー制約が発生する。
基数リファレンス表
| 関係の種類 | 現実世界の例 | データベース実装 |
|---|---|---|
| 1対1(1:1) | 従業員と社員証 | 1つのテーブルに外部キーを設置 |
| 1対多(1:M) | 部署から従業員 | 「Many」テーブル内の外部キー |
| 多対多(M:N) | 著者から本 | 2つの外部キーを持つ結合テーブル |
表記規範 📐
コードに構文があるように、図には表記があります。異なるチームやツールは、同じ概念を表すために異なる記号を使用する場合があります。共通の規範を知ることで、効果的に協働できるようになります。
- クロウズフット表記: これは、大多数の現代的なデータベースツールにおける業界標準です。関係の端に線と特定の記号を使用して、基数を示します。単一の線は「1」を表し、三本の突起を持つ記号(カラスの足に似た形)は「多」を表します。
- チェン表記: これは、学術的な場面でよく使われる古いスタイルです。関係を表すために菱形を使い、属性には楕円を使います。産業界のツールではあまり使われませんが、レガシードキュメントで識別できるようにしておくことは価値があります。
- UMLクラス図: 統合モデル化言語(UML)の図は、ソフトウェア工学で使用されます。ERDに似ていますが、データの保存よりもコード構造に重点を置いています。可視性記号(+、-、#)を含んでいますが、純粋なデータベース設計にはあまり関係がありません。
新しいプロジェクトを始める際は、早期に表記方法について合意しましょう。スタイルを混在させると、コードレビュー時やチームの引継ぎ時に混乱を招く可能性があります。
正規化との関係 🧹
ERDを設計することは、箱と線を描くことだけではありません。データを整理して冗長性を減らし、整合性を高めることが目的です。このプロセスを正規化といいます。図に正規化のルールを描くわけではありませんが、ERDはこれらのルールの結果を反映しています。
最初の3つの正規形について、簡単に説明します:
- 第一正規形(1NF): 各列に原子的な値が含まれていることを確認してください。1つのセルにリストを格納しないでください。すべてのレコードは一意でなければなりません。
- 第二正規形(2NF): 1NFに準拠している必要があります。すべての非キー属性は、主キーに完全に依存している必要があります。これにより、部分的依存を防ぎます。
- 第三正規形(3NF): 2NFに準拠している必要があります。推移的依存がないようにします。非キー属性は、他の非キー属性に依存してはいけません。
ERDに「User_Name」、「User_Email」、「Department_Name」の列を持つ「User」テーブルが含まれている場合、3NFに違反している可能性があります。部署名はユーザーに直接依存するのではなく、部署IDに依存しています。別個の「Department」エンティティを作成し、それらをリンクすべきです。
スクラッチからスキーマを作成する 🛠️
白紙の状態から構造化された図へどのように移行するのでしょうか?見落としのないよう、論理的な順序に従いましょう。
1. 要件を収集する
1本の線も描く前に、ステークホルダーと話し合いましょう。どのデータを保存する必要がありますか?ユーザーはどのような質問をしますか?「地域別売上高」を報告する必要がある場合、「地域」エンティティと「売上」エンティティをリンクする必要があります。
2. エンティティを特定する
異なる対象を表す名詞をすべてリストアップしてください。形容詞や動詞は除外してください。「注文を出す」はプロセスであり、エンティティではありません。「注文」がエンティティです。
3. 属性の定義
各エンティティにプロパティを割り当てる。どの属性が識別子であるかを決定する。一意性を保証するために、すべてのテーブルに主キー(PK)が必須である。関係を確立するために、外部キー(FK)が必要である。
4. 関係の確立
線を引く。基数を決定する。関係が必須かオプションかを判断する。たとえば、注文は顧客なしで存在できるか?通常はできない。製品はカテゴリなしで存在できるか?カテゴリなしのアイテムを許可する場合、可能である。
5. モデルの検証
データフローを確認する。ユーザーが登録すると、データはどこへ行くか?ユーザーがアカウントを削除すると、その注文はどうなるか?図はデータ損失なしにこれらの操作をサポートしているか?
一般的な落とし穴 ⚠️
経験豊富なエンジニアですらミスをする。一般的な誤りに気づいておくことで、後で大幅な再設計時間を節約できる。
- 外部キーの欠落:紙に線を引くのは簡単である。コードに制約を実装するのは難しい。ERDのすべての線が対応するデータベース制約を持っていることを確認する。
- 循環依存:AがBにリンクし、BがCにリンクし、CがAに戻るような連鎖を避ける。これによりクエリで無限ループが発生し、データ削除が難しくなる可能性がある。
- 命名の不整合:「User_ID」と「UserID」を混在させてはいけない。一貫した命名規則を守る。データベースのカラムではアンダースコアが標準的だが、コードではキャメルケースが一般的である。
- 過剰な正規化:正規化は良いが、やりすぎるとクエリが遅くなる。読み取りパフォーマンスが書き込みパフォーマンスより重要である場合は、戦略的に非正規化を行う。
- データ型の無視:ERDは構造だけでなくデータである。「日付」フィールドと「文字列」は同じではない。図が正しいストレージタイプを示していることを確認する。
ERDと他の図との違い 🆚
ERDを他の技術的図と混同しやすい。違いを理解することで、適切なツールを適切な目的に使うことができる。
- フローチャート:これらは論理または制御の流れを示す。判断にはダイアモンド、処理には長方形を使用する。データ構造は示さない。
- スキーマ図:これらは、既存のデータベースから図を生成することによって得られることが多い。物理的実装であり、インデックスや特定のデータ型を示すことが多い。
- 概念モデル:これらは高レベルのERDである。データ型やテーブル名などの技術的実装の詳細ではなく、ビジネス上の概念に焦点を当てる。
論理設計フェーズではERDを使用する。物理的実装フェーズではスキーマ図を使用する。
保守と進化 🔄
データベースは一度限りのプロジェクトではない。ビジネスの変化に伴って進化する。あなたのERDもそれに合わせて進化しなければならない。
- バージョン管理: 図をコードのように扱いましょう。リポジトリに保存し、変更を追跡しましょう。カラムを追加する場合は、その理由を文書化してください。
- ドキュメント: 図は視覚的な補助ですが、コメントが文脈を説明します。複雑な論理や特定の制約についてのメモを追加しましょう。
- レビューのサイクル: データモデルの定期的なレビューをスケジュールしましょう。古くなった仮定はもはや成り立たないかもしれません。5年前は「任意」だったフィールドが、今では「必須」になっている可能性があります。
データ整合性についての最終的な考察 ✅
エンティティ関係図(ERD)は、データインフラの設計図です。SQLの一行も書く前に、情報がどのようにつながるかを決める場所です。適切に設計されたERDは、より高速なクエリ、より簡単な保守、そして少ないバグをもたらします。
初心者の開発者にとって、このスキルを学ぶために時間を投資することは大きなリターンがあります。個別のクエリを書くという視点から、一貫したシステムを設計する視点へと変わります。データベース管理者(DBA)にとっては、下層のストレージを監査・最適化するための主要なツールです。
明確さに注目しましょう。関係性に注目しましょう。データの誠実さを保つルールに注目しましょう。これがデータベース設計の本質です。
まず紙に次のプロジェクトのスケッチを描きましょう。エンティティを特定し、接続をマッピングしましょう。基数を確認しましょう。図が意味をなしていれば、データベースもそれに従います。











