ER図の作図について、 Draw.io, PlantUML, Mermaid を比較してみる。（VSCode拡張機能など）


# はじめに

データベース設計のER図について、VSCodeなどで作成する以下３つの方法を比較した記事です。
- Draw.io
- PlantUML
- Mermaid

![draw.io (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/3c58ecdd-7e30-edab-e139-8b55bff6f754.jpeg)

以前、Webアプリケーションを作成した際には、 Draw.io を使用して、作図しました。
（そのアプリのER図を今回サンプル図としています）

https://qiita.com/ryamate/items/c3b4f63f8d94ab090bf8

最近、 PlantUML を利用するようになり、ER図や、シーケンス図、クラス図の作図に利用しているのですが、とても編集しやすいと感じています。

ただ、どのツールにも、一長一短あるかと思いますので、それぞれ以下目次の内容を書いて、ご紹介したいと思います。

## 目次
[1. Draw.io](#1-drawio)
　[1-1. VSCodeでの使い方](#1-1-vscodeでの使い方)
　[1-2. ER図](#1-2-er図)
　[1-3. 感想](#1-3-感想)
[2. PlantUML](#2-plantuml)
　[2-1. VSCodeでの使い方](#2-1-vscodeでの使い方)
　[2-2. ER図](#2-2-er図)
　[2-3. 感想](#2-3-感想)
[3. Mermaid](#3-mermaid)
　[3-1. VSCodeでの使い方](#3-1-vscodeでの使い方)
　[3-2. ER図](#3-2-er図)
　[3-3. 感想](#3-3-感想)
[まとめ](#まとめ)

結論としては、今後ER図を書くときには PlantUML をメインで利用しようと考えています。

一方、 Mermaid というマークダウン構文は Notion のコードブロックでプレビュー表示ができる！ということを知り、 Notion でさっと書きたい時は Mermaid で書くようにしてみようかな、とも考えています。

※ 2022/08/16 追記
ER図の作図についての関連記事を投稿しました。

https://qiita.com/ryamate/items/12bd8cd819079c28644c

## 環境

- macOS Big Sur バージョン: 11.6
- Visual Studio Code バージョン: 1.68.1


# 1. Draw.io

Webアプリ作成当時は、 draw.io というフローチャートやダイアグラムの作図ツールを利用して作成しました。

https://www.draw.io/

<br>

## 1-1. VSCodeでの使い方

### 拡張機能「Draw.io Integration」のインストール

draw.io は、 拡張機能「Draw.io Integration」をインストールするだけで使い始められます。

https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio

### 参考（draw.io 導入後の編集中画面）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/2a0e97c2-dab3-ff11-2b56-ef1ec33c4a97.png)

<br>

## 1-2. ER図

Webアプリ作成当時のER図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/2c45e0e7-d929-c903-7f9e-fa4ecf65c0bc.png)

## 1-3. 感想

作業としては、ER図用のパーツ（エンティティ）を手動で配置して、そこにデータを入力、線（リレーションシップ）を追記していく、というそこそこ地道な作業をする必要があります。

Webアプリの作成中、変更箇所を都度編集しながら、ER図がわかりやすく、収まり良く見えるように配置を考えたりしました。

例えば、機能追加によりテーブルが追加される場合には、エンティティの配置を手動でずらしてスペースを調整する必要があり、かなり面倒だと感じていました。（Excel などよりは百倍楽だったと思いますが…）

自由度はその分高いため、図を変更する必要がなくなった段階で、完成形を綺麗な図を書きたいときに使用するのにはいいかと思います。

<br><br>

# 2. PlantUML

> **PlantUML**は、以下のようなダイアグラムを素早く作成するためのコンポーネントです。
> 

https://plantuml.com/ja/

シーケンス図、ユースケース図、クラス図などのUMLを簡単な記法で作成できます。

<br>

UMLではない ER図 もサポートしており、コードでテーブルの情報、関係性を書いておくと、その通り図を表示してくれます。

https://plantuml.com/ja/ie-diagram

## 2-1. VSCodeでの使い方

### 拡張機能「PlantUML」のインストール

そして、draw.ioと同じく、VSCodeの拡張機能としてもインストールできます。

https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

VSCodeの拡張機能「PlantUML」を検索した後、「インストール」ボタンをクリックして、インストール成功した後、Macの場合、下記のインストールをする必要があります。

```bash
brew install --cask temurin
brew install graphviz
```

### ※ 参考記事「PlantUML を VSCode で利用したいけど、プレビューが表示されずエラーが出る」

https://qiita.com/ryamate/items/df9fb6584616c5c9f99f

### 参考（PlantUML 導入後の編集中画面）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/dbccc3af-4a28-0f70-111f-1bf6f61ca9b6.png)

<br>

## 2-2. ER図

### 今回作成したER図

```plantuml
@startuml yonde
' hide the spot
hide circle

' avoid problems with angled crows feet
skinparam linetype ortho

entity "families" as families {
  id
  --
  name
  nickname
  introduction
  created_at
  updated_at
}

entity "users" as users {
  id
  --
  family_id<<FK>>
  name
  nickname
  email
  email_verified_at
  password
  remember_token
  icon_path
  relation
  created_at
  updated_at
  deleted_at
}

entity "children" as children {
  id
  --
  family_id<<FK>>
  name
  gender_code
  birthday
  created_at
  updated_at
}

entity "picture_books" as picture_books {
  id
  --
  family_id<<FK>>
  user_id<<FK>>
  google_books_id
  isbn_13
  title
  authors
  published_date
  thumbnail_url
  five_ster_rating
  read_status
  review
  created_at
  updated_at
}

entity "read_records" as read_records {
  id
  --
  picture_book_id<<FK>>
  family_id<<FK>>
  user_id<<FK>>
  memo
  read_date
  created_at
  updated_at
}

entity "child_read_record" as child_read_record {
  id
  --
  read_record_id<<FK>>
  child_id<<FK>>
  created_at
  updated_at
}

entity "tags" as tags {
  id
  --
  name
  created_at
  updated_at
}

entity "read_record_tag" as read_record_tag {
  id
  --
  read_record_id<<FK>>
  tag_id<<FK>>
  created_at
  updated_at
}

entity "follows" as follows {
  id
  --
  follower_user_id<<FK>>
  followee_family_id<<FK>>
  created_at
  updated_at
}

entity "likes" as likes {
  id
  --
  user_id<<FK>>
  picture_book_id<<FK>>
  created_at
  updated_at
}

entity "invites" as invites {
  id
  --
  family_id<<FK>>
  email
  token
  created_at
  updated_at
}

entity "contacts" as contacts {
  id
  --
  email
  nickname
  name
  title
  body
  created_at
  updated_at
}

entity "password_resets" as password_resets {
  --
  email
  token
  created_at
}

families ||--|{ users
families ||--|{ children
families ||--o{ follows
families ||--o{ picture_books
families ||--o{ read_records
families ||--o{ invites
users ||--o{ follows
users ||--o{ likes
users ||--o{ picture_books
users ||--o{ read_records
children ||--o{ child_read_record
picture_books ||--o{ read_records
picture_books ||--o{ likes
read_records ||--o{ child_read_record
read_records ||--o{ read_record_tag
tags ||--o{ read_record_tag

@enduml
```

Qiita記事でも、コードブロック内でPlantUMLの構文がそのまま使えます。（このER図は、Qiitaのコードブロックで表示させています）

### 今回作成したER図のPlantUMLの表記

```
@startuml yonde
' hide the spot
hide circle

' avoid problems with angled crows feet
skinparam linetype ortho

entity "families" as families {
  id
  --
  name
  nickname
  introduction
  created_at
  updated_at
}

entity "users" as users {
  id
  --
  family_id<<FK>>
  name
  nickname
  email
  email_verified_at
  password
  remember_token
  icon_path
  relation
  created_at
  updated_at
  deleted_at
}

entity "children" as children {
  id
  --
  family_id<<FK>>
  name
  gender_code
  birthday
  created_at
  updated_at
}

entity "picture_books" as picture_books {
  id
  --
  family_id<<FK>>
  user_id<<FK>>
  google_books_id
  isbn_13
  title
  authors
  published_date
  thumbnail_url
  five_ster_rating
  read_status
  review
  created_at
  updated_at
}

entity "read_records" as read_records {
  id
  --
  picture_book_id<<FK>>
  family_id<<FK>>
  user_id<<FK>>
  memo
  read_date
  created_at
  updated_at
}

entity "child_read_record" as child_read_record {
  id
  --
  read_record_id<<FK>>
  child_id<<FK>>
  created_at
  updated_at
}

entity "tags" as tags {
  id
  --
  name
  created_at
  updated_at
}

entity "read_record_tag" as read_record_tag {
  id
  --
  read_record_id<<FK>>
  tag_id<<FK>>
  created_at
  updated_at
}

entity "follows" as follows {
  id
  --
  follower_user_id<<FK>>
  followee_family_id<<FK>>
  created_at
  updated_at
}

entity "likes" as likes {
  id
  --
  user_id<<FK>>
  picture_book_id<<FK>>
  created_at
  updated_at
}

entity "invites" as invites {
  id
  --
  family_id<<FK>>
  email
  token
  created_at
  updated_at
}

entity "contacts" as contacts {
  id
  --
  email
  nickname
  name
  title
  body
  created_at
  updated_at
}

entity "password_resets" as password_resets {
  --
  email
  token
  created_at
}

families ||--|{ users
families ||--|{ children
families ||--o{ follows
families ||--o{ picture_books
families ||--o{ read_records
families ||--o{ invites
users ||--o{ follows
users ||--o{ likes
users ||--o{ picture_books
users ||--o{ read_records
children ||--o{ child_read_record
picture_books ||--o{ read_records
picture_books ||--o{ likes
read_records ||--o{ child_read_record
read_records ||--o{ read_record_tag
tags ||--o{ read_record_tag

@enduml
```

## 2-3. 感想

こちらの図のお互いのエンティティ（テーブル）の位置は、コードの修正をすれば適当な配置にエンティティが移動してくれるので、非常に編集しやすいと感じました。

例えば、機能追加により、テーブルが追加される場合でも、 PlantUML ならコードを追加、修正するだけで、あとは勝手にエンティティとリレーションシップを調整してくれるのでかなり楽です。

自分で draw.io で作成したER図よりも リレーションシップ（線）の重なりが少なくて見やすいと感じ、出来としても申し分なしだと思いました。

また、 Git で変更履歴もコードとして確認できるのもメリットの一つだと思います。

<br><br>

# 3. Mermaid

> Mermaidとは、フローチャート、シーケンス図、クラス図、ガントチャート、およびgitグラフを生成するためのマークダウン構文です。
> 

https://dev.classmethod.jp/articles/mermaid-markdown-is-supported-in-notion/

https://mermaid-js.github.io/mermaid/#/


<br>

こちら Mermaid は、検索していて Notion でも使えるということで、私はパソコン上では Notion を基盤に生活しているような感じなので、こちらはぜひ試してみたいと思い、使ってみました。

https://www.notion.so/ja-jp/product

## 3-1. VSCodeでの使い方

Mermaid は、 拡張機能をインストールするだけで使い始められます。

### 拡張機能「Markdown Preview Mermaid Support」のインストール

プレビュー用の拡張機能です。

https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid

### 拡張機能「Mermaid Markdown Syntax Highlighting」のインストール

コードの色付け用の拡張機能です。

https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting

<br>

### 参考（Mermaid の拡張機能導入後の編集中画面）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/8722d485-8c51-f06f-a4f4-cd900d0dabd7.png)

.md ファイル内で記述しています。

## 3-2. ER図

### 今回作成したER図

```mermaid
erDiagram
	families ||--|{ users : ""
	families ||--|{ children : ""
	families ||--o{ follows : ""
	families ||--o{ picture_books : ""
	families ||--o{ read_records : ""
	families ||--o{ invites : ""
	users ||--o{ follows : ""
	users ||--o{ likes : ""
	users ||--o{ picture_books : ""
	users ||--o{ read_records : ""
	children ||--o{ child_read_record : ""
	picture_books ||--o{ read_records : ""
	picture_books ||--o{ likes : ""
	read_records ||--o{ child_read_record : ""
	read_records ||--o{ read_record_tag : ""
	tags ||--o{ read_record_tag : ""
	families {
	  bigint id PK
	  varchar name
	  varchar nickname
	  varchar introduction
	}
	users {
	  int id PK
	  int family_id FK
	  varchar name
	  varchar nickname
	  varchar email
	  timestamp email_verified_at
	  varchar password
	  varchar remember_token
	  varchar icon_path
	  varchar relation
	  timestamp deleted_at
	}
	children {
	  int id PK
	  int family_id FK
	  varchar name
	  int gender_code
	  date birthday
	}	
	picture_books {
	  int id PK
	  int family_id FK
	  int user_id FK
	  varchar google_books_id
	  varchar isbn_13
	  varchar title
	  varchar authors
	  varchar published_date
	  varchar description
	  varchar thumbnail_url
	  int five_star_rating
	  int read_status
	  varchar review
	}
	read_records {
	  int id PK
	  int picture_book_id FK
	  int family_id FK
	  int user_id FK
	  varchar memo
	  date read_date
	}
	child_read_record {
	  int id PK
	  int read_record_id FK
	  int child_id FK
	}
	tags {
	  int id PK
	  varchar name
	}
	read_record_tag {
	  int id PK
	  int read_record_id FK
	  int tag_id FK
	}
	follows {
	  int id PK
	  int follower_user_id FK
	  int followee_family_id FK
	}
	likes {
	  int id PK
	  int user_id FK
	  int picture_book_id FK
	}
	invites {
	  int id PK
	  int family_id FK
	  varchar email
	  varchar token
	}
	contacts {
	  int id PK
	  varchar email
	  varchar nickname
	  varchar name
	  varchar title
	  varchar body
	}

	password_resets {
	  string email
	  string token
	}
```

Mermaid についても、Qiita記事にも構文がそのまま使えます。（このER図は、Qiitaのコードブロックで表示させています）

https://qiita.com/Qiita/items/c07f3262d8f3b25f06c9

<br>

ただ、 Qiita のコードブロック内では、2000文字を超えると 表示されませんでした。（そのため、上記の図は2000文字以内になるように一部省略しました…）

![スクリーンショット 2022-07-28 14.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/cb0b0887-5c92-a83f-53e7-4e7c971782ce.png)

ちなみに、Notionでのプレビュー表示はこのような感じです。

![スクリーンショット 2022-07-28 14.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/57ec7b0d-4a4e-a828-3b3d-5afbf5583139.png)

### 今回作成したER図のMermaidのマークダウン構文

```
erDiagram
	families ||--|{ users : ""
	families ||--|{ children : ""
	families ||--o{ follows : ""
	families ||--o{ picture_books : ""
	families ||--o{ read_records : ""
	families ||--o{ invites : ""
	users ||--o{ follows : ""
	users ||--o{ likes : ""
	users ||--o{ picture_books : ""
	users ||--o{ read_records : ""
	children ||--o{ child_read_record : ""
	picture_books ||--o{ read_records : ""
	picture_books ||--o{ likes : ""
	read_records ||--o{ child_read_record : ""
	read_records ||--o{ read_record_tag : ""
	tags ||--o{ read_record_tag : ""
	families {
	  bigint id PK
	  varchar100 name
	  varchar255 nickname
	  varchar255 introduction
	  timestamp created_at
	  timestamp updated_at
	}
	users {
	  bigint id PK
	  bigint family_id FK
	  varchar255 name
	  varchar255 nickname
	  varchar255 email
	  timestamp email_verified_at
	  varchar255 password
	  varchar100 remember_token
	  varchar255 icon_path
	  varchar100 relation
	  timestamp created_at
	  timestamp updated_at
	  timestamp deleted_at
	}
	children {
	  bigint id PK
	  bigint family_id FK
	  varchar100 name
	  int gender_code
		date birthday
	  timestamp created_at
	  timestamp updated_at
	}	
	picture_books {
	  bigint id PK
	  bigint family_id FK
	  bigint user_id FK
	  varchar100 google_books_id
	  varchar100 isbn_13
	  varchar255 title
	  varchar255 authors
	  varchar100 published_date
	  varchar1000 description
	  varchar1000 thumbnail_url
	  int five_star_rating
	  int read_status
	  varchar1000 review
	  timestamp created_at
	  timestamp updated_at
	}
	read_records {
	  bigint id PK
	  bigint picture_book_id FK
	  bigint family_id FK
	  bigint user_id FK
	  varchar1000 memo
	  date read_date
	  timestamp created_at
	  timestamp updated_at
	}
	child_read_record {
	  bigint id PK
	  bigint read_record_id FK
	  bigint child_id FK
	  timestamp created_at
	  timestamp updated_at
	}
	tags {
	  bigint id PK
	  varchar255 name
	  timestamp created_at
	  timestamp updated_at
	}
	read_record_tag {
	  bigint id PK
	  bigint read_record_id FK
	  bigint tag_id FK
	  timestamp created_at
	  timestamp updated_at
	}
	follows {
	  bigint id PK
	  bigint follower_user_id FK
	  bigint followee_family_id FK
	  timestamp created_at
	  timestamp updated_at
	}
	likes {
	  bigint id PK
	  bigint user_id FK
	  bigint picture_book_id FK
	  timestamp created_at
	  timestamp updated_at
	}
	invites {
	  bigint id PK
	  bigint family_id FK
	  varchar255 email
	  varchar16 token
	  timestamp created_at
	  timestamp updated_at
	}
	contacts {
	  bigint id PK
	  varchar255 email
	  varchar255 nickname
	  varchar255 name
	  varchar255 title
	  varchar255 body
	  timestamp created_at
	  timestamp updated_at
	}

	password_resets {
	  string email
	  string token
	  timestamp created_at
	}
```

## 3-3. 感想

図の見た目は Mermaid よりも　PlantUML の方が個人的には好きです。 Mermaid はまだ見慣れないからかもしれませんが… Mermaid にはデザインのオプション設定はあるんですかね？

PlantUML の記法とそれほど書き心地は変わりませんので、 PlantUML を使用している方はすぐに書き慣れると思います。

<br><br>

# まとめ

今後ER図を書くときには PlantUML をメインで利用しようと考えています。（今のところは…）
Notion でさっと書きたい時があれば、 Mermaid で書くようにしてみようかな、とも考えています。

他にも良い方法があると耳にした時には、今後も柔軟に試していきたいです。
（こんなのもあるなど教えていただけますと幸いです）

記事は以上です！ありがとうございました。