データベース設計で用いられる手法の一つであるER図。しかし、書き方が分からないという人も多いのではないでしょうか。そこで、本記事ではER図の概要から、数種類ある記法の中でもテキストでグラフやチャートを描けるmermaid記法によるER図の書き方まで、段階的に解説します。サンプルコードも記述するので学習の参考にしてください。
まずはER図の言葉の意味とER図に出てくる用語についてみていきましょう。
ER図とは?
ER図とは、データベース設計で用いられる設計手法を指します。海外では 「Entity Relationship Diagram」と呼ばれ、で日本語にすると「エンティティ同士の関係図」となります。ER図は「エンティティ」「アトリビュート」「リレーション」「カーディナリティ」という4つのオブジェクトで構成されています。ER図を活用することでデータ構造を俯瞰的に捉えやすくなり、設計がしやすくなります。データベースが必要になるWeb開発やシステム設計には必ず用いられる手法で、エンジニアであれば押さえておきたい手法ですが、ER図といっても10種類ほどあり、種類によって記法も異なります。
関連する用語
ここではER図に出てくる用語の説明をしていきます。
エンティティ
直訳すると「モノ」となりますが、ER図においてはテーブルを指します。先程「ER図の意味」にてER図は「エンティティ同士の関係図」と記述しましたが、言い換えると「テーブル同士の関係を表した図」となります。
アトリビュート
エンティティの中で設定されている項目(カラム)を指します。
リレーション
エンティティ同士を結ぶ線のことです。この線の始点と終点にカーディナリティという記号が付きます。
カーディナリティ
直訳すると「多重度」と訳されます。リレーションの始点と終点に表記する記号で、エンティティ同士の関係を示します。エンティティ同士の関係とは、「1対1」「1対多」「多対多」といった紐付いているエンティティ同士の数です。
カーディナリティには他にも「カラムが持っている値の種類の数」や「テーブル内のレコード数」を指す場合もありますが、本記事では上記の「紐付いているエンティティ同士の数」を示しています。
使用用途
ここまでER図の意味や用語について解説していきましたが、そもそも「いつ」、「どのように」作成したり見たりするのかを知らないと、作成のイメージが湧きにくいと思います。ここでは作成する意図や使用用途についていくつか例を挙げていきます。
作成する意図
まずは作成する意図についてですが大きく2パターンあります。
一つは基本設計の段階で、データベース論理設計図として作成するパターンです。データベースを作成する前にER図に起こすことで、実際にデータベースを作成する前に問題点/改善点を発見し、より要件に沿ったデザインに出来るかもしれません。また、チームメンバー等に共有する際も、ER図を見たメンバーにイメージしてもらいやすいメリットもあります。
二つ目は既存のデータベースに対して作成するパターンです。既に作成・運用されているデータベースのER図を作成するということです。メリットとして、今のデータベースの構造を他のチームメンバーや、今後参画されるメンバー等に周知してもらう際にイメージしてもらいやすくなります。
使用用途
作成されたER図を使う用途として、データベース内の情報を収集する際にテーブル間の関係を追いやすくなります。また、今のデータベース構造をイメージするのに役立てるといった使い方や、テーブル間の構造やカラムを修正・追加する際の現状把握等にも役立ちます。
すべての状況において上記の作成する意図や使用用途のシーンに当てはまるとは限りませんのであくまでご参考までに…
ER図の種類
ER図には主にIE記法とIDEF1X記法の2種類の記法があります。リレーションに大きな違いがあり、IE記法は直感的にリレーションを理解しやすいです。一方でIDEF1X記法は細かくリレーションを表現することができます。今回はIE記法の書き方を紹介していきます。
IE記法とは
IE記法(Information Engineering)とは、リレーションが鳥の足のようになっていることから、「鳥の足記法」とも呼ばれます。IDEF1X記法よりもリレーションが直感的に理解しやすいため、新人研修などで積極的に利用されています。
記号 | 意味 |
○ | 0 |
l(縦棒) | 1 |
ψ | 多 |
IDEF1X記法とは
IDEF1X記法(Integreation Definition 1X)とは、アメリカの国立標準技術研究所(NIST)で作成された記法です。IE記法と同様に世界的にポピュラーなER図の記法です。直感的な理解のしやすさはIE記法に劣りますが、IE記法よりも詳細に表現ができるため、人気があります。
記号 | 意味 |
なし(エンティティと直線を結ぶ) | 1 |
● | 0以上 |
●P | 1以上 |
●Z | 0または1 |
●N | 指定した数。仕様に応じてNに実数を代入 (例:●5) |
●N-M | 実数の範囲を指定する。仕様に応じてNとMに実数を代入 (例:●1-5) |
◇ | 0または1※非依存リレーションでのみ使用 |
書き方(mermaid記法)
ここからはmermaid記法を用いてER図を作成していきます。mermaid記法とはテキストベースで様々な図やグラフを描くことができる記法で、ER図だけでなくフローチャートやシーケンス図、円グラフなども作成することができます。本記事では書き方や作成している内容を少しでもイメージしてもらうため、先にどのような図を作成するかを説明します。
作成する図の要件
本記事では中学校/高校を題材にしていきます。テーブル毎に詳しく内容を定義し、これに沿って書き方を説明していきます。尚、本記事では説明の為、各テーブル最低限のカラムのみ定義しております。
生徒テーブル
カラム: ID, 生徒名, クラスID, 委員会ID
教師テーブル
カラム: ID, 教師名
クラステーブル
カラム: ID, 学年/クラス名, 担任教師ID
部活テーブル
カラム: ID, 部活名, 顧問教師ID
委員会テーブル
カラム: ID, 委員会名, 顧問教師ID
部活_生徒テーブル
カラム: ID, 部活ID, 生徒ID
テーブル間の関係性について
- 生徒は必ず一つのクラスと委員会に所属する。
- 生徒は部活に所属することができる。(複数の部活に所属していてもよいし、無所属でもよい)
- 教師はクラス,部活,委員会それぞれにおいて一つまで担当、顧問になる。
準備
本記事ではVisual Studio Codeを使用してER図を作成していきます。その前に準備することをまとめます。
1.拡張機能を追加する
まずはVisual Studio Code内に下記2つの拡張機能を追加します。
- Markdown Preview Mermaid Support
この拡張機能は記述したコードを元にプレビュー画面にて図を生成してくれます。
- Mermaid Markdown Syntax Highlighting
こちらはmermaid記法で記述したコードに色をつけてコードを見やすくしてくれます。
2.ファイルを作成
次にコードを記述するファイルを拡張子「.md」で作成します。(ここでは「school.md」で作成します。)
3.プレビュー画面を表示させておく
作成したファイルを開き、画面右上にあるプレビュー表示ボタン(下に添付した画像の赤枠部分)をクリックします。
すると画面右側にプレビュー画面が表示されます。これで準備完了になります。
コーディング
ここからはいよいよコーディングを進めていきます。
基本
まずは下のようにmermaid記法を宣言します。この「`」はバッククォートです。
「erDiagram」と「“`」の間にコードを書いていきます。
```mermaid
erDiagram
ここにコードを書いていきます。
```
エンティティ
次にエンティティを作成していきます。まずは生徒エンティティを下記のように記述します。
```mermaid
erDiagram
student {
INT Id PK "生徒ID"
VARCHAR(255) Name "生徒名"
INT ClassId "クラスID"
INT CommitteId "委員会ID"
}
```
最初にエンティティ名、波括弧の中にアトリビュートの内容を書いていく形になります。
アトリビュートの内容の記述順として右から「アトリビュートの型」「カラム名」「キー」「備考」となります。
Visual Studio Code上ではこのようにプレビュー画面が表示されます。
とりあえず、エンティティも全て作成します。
erDiagram
student {
INT Id PK "生徒ID"
INT ClassId FK "クラスID"
INT CommitteId FK "委員会ID"
VARCHAR(255) Name "生徒名"
}
teacher {
INT Id PK "教師ID"
VARCHAR(255) Name "教師名"
}
class {
INT Id PK "クラスID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "クラス名"
}
club {
INT Id PK "部活ID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "部活名"
}
committeId {
INT Id PK "委員会ID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "委員会名"
}
club_student {
INT Id PK "生徒ID"
INT ClassId FK "クラスID"
INT CommitteId FK "委員会ID"
}
Visual Studio Code上ではこのようになります。
リレーション
続いて、先ほど作成したエンティティ同士を紐付けるリレーション(線)を記述していきます。
下記には生徒とクラス間リレーションを表していきます。(他のエンティティは割愛しております。)クラス1つに対して複数の生徒が所属する為、1対多の関係になります。
erDiagram
student {
INT Id PK "生徒ID"
INT ClassId FK "クラスID"
INT CommitteId FK "委員会ID"
VARCHAR(255) Name "生徒名"
}
class {
INT Id PK "クラスID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "クラス名"
}
class ||--|{ student: "生徒-クラス間"
記述順としては「エンティティ」「リレーション」「エンティティ」「:(コロン)」「備考/メモ」となっています。下記にリレーションでよく使う記号を意味をまとめます。
記号 | 意味 |
— | エンティティ間の線(実線) |
.. | エンティティ間の線(破線) |
|| | 対1の関係 |
|{ と }| | 対1以上の関係 |
o{ と }o | 対0以上の関係 |
|o と o| | 対0もしくは1の関係 |
他のリレーションも加えたものが下記になります。
erDiagram
student {
INT Id PK "生徒ID"
INT ClassId FK "クラスID"
INT CommitteId FK "委員会ID"
VARCHAR(255) Name "生徒名"
}
teacher {
INT Id PK "教師ID"
VARCHAR(255) Name "教師名"
}
class {
INT Id PK "クラスID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "クラス名"
}
club {
INT Id PK "部活ID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "部活名"
}
committe {
INT Id PK "委員会ID"
INT TeacherId FK "教師ID"
VARCHAR(255) Name "委員会名"
}
club_student {
INT Id PK "クラス_生徒ID"
INT ClassId FK "クラスID"
INT StudentId FK "生徒ID"
}
student }|--|| committe: "生徒_委員会間"
student }|--|| class: "生徒_クラス間"
club }|--|| club_student: "中間_部活間"
student }o--|| club_student: "中間_生徒間"
teacher |o--|| club: "教師_部活間"
teacher |o--|| committe: "教師_委員会間"
teacher |o--|| class: "教師_クラス間"
これでER図が形になりました。補足として、リレーションを記述する行の順番を入れ替えることでエンティティやリレーションの形を変更することができます。
ER図の作成ツール紹介
ここでは、ER図を作成する際に役立つツールを紹介していきます。
Notion
Notionのコードブロックを用いて簡単に記述することができます。コードブロック内左上にある言語選択部分から「Mermaid」を選択することでコードを書くことができ、その下にER図が表示されます。
公式ページ:https://www.notion.so/ja-jp
github
githubもNotionと同じようにコードブロックを使用して記述することができます。また、記述したコードをER図に起こしてgithub内で共有、閲覧することができます。
公式ページ:https://github.com/
dbdiagram.io
こちらはブラウザ上でコードを書くことができるツールです。特徴として、作成したエンティティの配置を自由に変えることができます。さらに、完成したER図を画像としてダウンロードすることもできます。