MySQL WorkBenchでER図を作成する手順


## はじめに

この記事はMacにインストールされたMySQL WorkBenchでER図(EER図)を作成した手順のメモになります

## ER図とは

- Entity-Relationship Diagram
- エンティティ・リレーションシップ図

ER図を使うと、データベースを設計するときに、どんな情報を保存するか、そしてそれらの情報がどのように関連しているかを一目で理解できるようになります。

![スクリーンショット 2024-09-18 15.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3d9a5257-5a3f-3da1-470d-e8ff380c34d1.png)


### エンティティ（Entity） ＝ 物 / 人 / 概念
エンティティとは、データベースに保存する対象のことです。
例えば「お客さん」「商品」「注文」などが含まれます。エンティティは、データベースに保存される大切な情報を表します。

### リレーションシップ（Relationship） ＝ つながり/関係
リレーションシップは、エンティティ同士の関係を表します。
例えば「お客さん」が「注文をする」といった関係がリレーションシップです。

## MySQL WorkBenchでの作成手順
前提条件としまして以下をクリアした場合の手順になります

- MySQL WorkBenchを起動している
- 既にサーバーとMySQL WorkBenchの接続が完了している


### 1. 新しいモデルの作成

上部メニューから「File」 > 「New Model」を選択します。
これにより、新しいデータベースモデルが作成されます。ここからER図の作成を始めます。

![スクリーンショット 2024-09-17 13.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/26770207-05de-2c77-0668-5ca3774a55a4.png)

### 2. 新しいEERダイアグラムの作成
画面に存在する「Add Diagram」ボタンをクリックします。

![スクリーンショット 2024-09-17 13.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/1c16f57f-226f-f677-b627-9ab7db03de37.png)

### 3. テーブルを追加する

サイドメニューからテーブルを作成するアイコンをクリックし、キャンバスの任意の場所をクリックすることでテーブルが追加されます

![スクリーンショット 2024-09-17 14.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/319d5a43-8c94-de0e-ae0d-f5fcb4cad868.png)

#### テーブル追加時の補足

テーブルを追加するアイコンをクリック時、次の選択肢が表示されますが、特に操作しなくてもテーブルの追加は可能です

- `Template（テンプレート）`
テーブルを作成するときに使用できる「ひな形」です。似たような構造を持つテーブルを簡単に作ることができます。

- `Schema（スキーマ）`
データベース内でテーブルやビュー、インデックスなどをまとめて管理する構造や範囲を指します。スキーマはデータベースの一部を整理するためのフォルダのような役割を果たします。

- `Collation（照合順序）`
照合順序は、テキストデータの比較方法やソート方法を決めるルールです。つまり、文字列の並べ替えや検索時に、どのように文字が比較されるかを指定します。例えば、アルファベットの大文字・小文字の区別をするかしないかなどの設定もここで決まります。

- `背景色`
ER図に示されたテーブルの背景色を設定できます

- `Engine（エンジン）`
データの保存方法や処理方法を決定するシステムのことです。MySQLにはいくつかの異なるエンジンがあり、データの特性に応じて使い分けることができます。代表的なものには次の2つがあります
##### `InnoDB`
現在のMySQLでの標準エンジン。トランザクション（データの一貫性を確保するための仕組み）をサポートし、リレーションシップ（外部キー制約）を使う場合にも適しています。
##### `MyISAM`
昔のデフォルトエンジン。高速だが、トランザクションのサポートがないため、データ整合性が必要な場合には適していません。

### 4. テーブルのプロパティを変更する

追加したテーブルの枠をクリックするとプロパティウィンドウが表示されるため、主に以下の情報を変更します

- テーブル名を入力します（例：users、ordersなど）
- カラム（フィールド）を追加し、各カラムに適切なデータ型（整数型や文字列型など）を設定します
- 主キー（Primary Key）を設定します（idカラムなどを主キーに設定します）

![スクリーンショット 2024-09-17 14.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/baa5fe8f-08fc-993b-2818-bf9b1df63b93.png)

#### テーブルのプロパティについて

テーブルの設定時に表示されるチェック項目はカラムに対して特定の制約やプロパティを設定する物です

![スクリーンショット 2024-09-17 15.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/12163eed-00d5-f93f-bbcb-676493957e26.png)

- `PK（Primary Key）`
主キー。レコードに対してユニーク（重複しない）な値を持たせ、データの整合性を保つために使用します。
- `NN（Not Null）`
null（値がない状態）が入らないことが保証されます。必ず値を入力しなければならないカラムです。
- `UQ（Unique Key）`
一意キー。「UN（Unique）」と非常に似ており、一意性を保証するためのカラムやカラムの組み合わせです
- `UN（Unique）`
一意制約。指定したカラムの値がテーブル内でユニークであることを保証します
- `B...（Binary）`
、データがバイナリ形式で格納されることを示し、画像ファイル、音声ファイル、その他の非テキストデータを格納することができます。
- `ZF（Zero Fill）`
カラムの値が表示される際に、指定した桁数に満たない場合に自動的にゼロで埋める設定です
- `AI（Auto Increment）`
主キーに設定することが多く、レコードが追加されるたびに自動的に値が増加するようにします。例えば、新しいidを1ずつ増加させることができます
- `G（Generated）`
生成カラムの値は、テーブル内の他のカラムの値に基づいて自動的に計算されます。例えば、price（価格）と tax_rate（税率）から計算される total_price（総価格）を生成カラムとして設定できます。
#### IDカラムで設定されるプロパティの例

- `ID カラムのデータ型`: INT や BIGINT（整数型）
- `PK`: 主キーに設定
- `AI`: 自動増分に設定
- `NN`: Not Null（必須）

##### UNとUQの違いについて

- `UN（Unique）`
単一カラムまたは複数カラムの組み合わせに対して、値が重複しないようにする制約です
- `UQ（Unique Key）`
複数カラムの組み合わせに対して一意性を保証する制約です。通常、UNと同じ機能ですが、複数カラムの組み合わせに使うことが一般的です。

※ 同時に使用することも可能です

5. リレーションを作成する

複数のテーブルが存在する場合はリレーションシップを作成できます。これにより、異なるテーブル同士の関係を設定できます。

「1対多（One to Many）」のアイコンをクリックし、2つのテーブルを順にクリックしてリレーションシップを作成します。

例えば、`users`と`orders`テーブルの関係を設定する場合、1人のユーザーが複数の注文をすることがあるので、「1対多」の関係を作成します。

![スクリーンショット 2024-09-17 16.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/89c6373e-a66b-3570-e9e9-e953314bf1a0.png)



### (補足) ER図の保存
作成したERダイアグラムを保存するには、以下の手順を実行します

- 「File」 > 「Save Model」を選択してモデルを保存します

![スクリーンショット 2024-09-17 17.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/18bc999e-4ddd-1ae4-b2c5-09a9a2b95321.png)



## 編集中のER図を反映させる

現在編集中のEERダイアグラムを実際のデータベースに反映させる場合、次の手順を使用します。

「Database」 > 「Forward Engineer」をクリックします。

指示に従って、データベースに反映したい内容を選択し、最終的にデータベース上にテーブルやリレーションシップが作成されます。

### Connection Options

ER図のテーブルを反映させたいデータベースの情報を入力します
既にデータベースを作成済みの場合はデータベース名を選択肢から選択できます

![スクリーンショット 2024-09-17 18.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/681c7b0f-0b1c-dc09-fbac-b8c5992995fb.png)

### Options

データベースを作成する際のオプションを設定します

![スクリーンショット 2024-09-17 18.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/a5694d6d-6892-4b7d-5d60-9975143a577d.png)

※以下は翻訳結果なので実際の動作と誤差が生じる可能性があります

- `Skip Creation of FOREIGN KEYS`
外部キー制約の作成をスキップします。データベースの整合性を保つための外部キーが必要ない場合や、後で手動で設定したい場合に使用します。

- `Skip Creation of FK indexes as well`
外部キーに関連するインデックスの作成もスキップします。外部キーとそのインデックスの作成を省略する場合に使用します。

- `Generate Separate CREATE INDEX statements`
テーブルのインデックス作成を、テーブル作成のステートメントとは別に生成します。インデックス作成のステートメントを分けて管理したい場合に使用します。
- `Generate INSERT statements for tables`
テーブルの初期データを挿入するためのINSERTステートメントも生成します。テーブルが作成された後にデータを自動的に挿入したい場合に使用します。
- `Disable FK checks for INSERTs`
外部キーの制約を無視してデータの挿入を行います。データベースにデータを挿入する際に外部キー制約のチェックを行わないようにします。
- `Don't create View placeholder tables`
ビュー用のプレースホルダーテーブルの作成を行いません。ビューをテーブルとして一時的に作成するプレースホルダーが不要な場合に使用します。
- `Do not create users. Only create privileges (GRANTs)`
ユーザーの作成を行わず、権限（GRANTs）のみを作成します。ユーザーは手動で追加し、権限のみ設定したい場合に使用します。
- `DROP objects before each CREATE object`
新しいオブジェクトを作成する前に、既存のオブジェクトを削除します。既存のオブジェクトを上書きしたい場合に使用します。
- `Generate DROP SCHEMA`
スキーマ（データベース）の削除ステートメントも生成します。スキーマが存在する場合に削除してから再作成したい場合に使用します。
- `Omit schema qualifier in object names`
オブジェクト名にスキーマの指定を省略します。オブジェクト名を簡潔にしたい場合に使用します。
- `Generate USE statements`
スクリプトの実行時に、特定のデータベースを使用するためのUSEステートメントを生成します。スクリプトが特定のデータベースに対して実行されるようにしたい場合に使用します。
- `Add SHOW WARNINGS after every DDL statement`
DDL（データ定義言語）ステートメントの後にSHOW WARNINGSステートメントを追加し、警告メッセージを表示します。実行中に警告を確認したい場合に使用します。
- `Include model attached scripts`
モデルに添付されたスクリプトを含めます。ER図に関連付けられたスクリプトをデータベースに適用したい場合に使用します。

#### オプションはデフォルトで良いのか？

基本的にチェックボックスは`デフォルトのまま進める`ことで以下の状態になるため、チェックボックスは操作しない方が問題が起こりにくいかと思われます

- 外部キーやインデックスは自動で作成される
→ データの整合性を保つために自動で関連付けがされます。

- 初期データは挿入されない
→ テーブルだけが作られ、データは自分で追加する必要があります。

- 既存のデータやスキーマは削除されない
→ 既存のデータが残ったまま新しいテーブルが追加されます。

- 警告メッセージは表示されない
→ エラーが発生した場合に見逃す可能性があります。

### Select Objects

データベースに書き出す（反映する） 対象を選択します。今回はER図のテーブルをデータベースに書き出すため、`Export MySQL Table Objects`のみチェックを入れて進めます
![スクリーンショット 2024-09-17 18.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/2e883a72-26b1-f390-af50-7fc6a7b8bdc4.png)

#### 他の選択肢について

- `Export MySQL Table Objects`
MySQLデータベースのテーブルをエクスポートします。テーブルはデータベースの主要な要素で、データの保存場所です。このオプションはデフォルトで選択されています。今回5つのテーブルがあることが示されています。
- `Export MySQL View Objects`
ビューをエクスポートします。ビューは仮想的なテーブルで、SELECTクエリの結果を仮想テーブルとして扱うものです。このオプションはデフォルトでは選択されておらず、0個のビューが含まれています。
- `Export MySQL Routine Objects`
ストアドプロシージャやストアドファンクションといった、サーバー側で実行されるSQLプログラムをエクスポートします。今回、ルーチンオブジェクトは含まれていないため、チェックは外れています。
- `Export MySQL Trigger Objects`
トリガーをエクスポートします。トリガーは、テーブルの特定のアクション（INSERT, UPDATE, DELETE）時に自動的に実行されるSQLプログラムです。今回、トリガーは含まれていないため、チェックは外れています。
- `Export User Objects`
ユーザー権限に関するオブジェクトをエクスポートします。ユーザーオブジェクトには、特定のユーザーに割り当てられた権限などが含まれますが、今回のエクスポート対象にはユーザーオブジェクトはありません。

### Review SQL Script

MySQL Workbenchを使用して、ER図で設計したテーブル構造を実際のデータベースに反映させるためのSQLスクリプトを確認するための画面です。

特に問題がなければそのまま進めますが、必要に応じてコードをファイルに保存したり、クリップボードにコピーすることも可能です

次の画面でSQLが実行されるため、失敗した場合はこのコードを修正することでエラー内容を修正できます

![スクリーンショット 2024-09-17 18.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/054f7ee3-2521-6b16-a657-098b72736052.png)


### Commit Progress

MySQL Workbenchを使用して ER図で設計したテーブル構造を実際のデータベースに反映させるためのSQLスクリプトを確認する ための画面です。
以下の画面ではエラーが発生しているため、前画面のSQLを修正してエラーを解消することで、データベースにテーブルを反映させるSQLを実行することができます

(エラーが発生したした場合)
![スクリーンショット 2024-09-18 14.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/9197c520-aaa6-a192-0f30-13ef01e0ab95.png)


(SQLが成功した場合)
![スクリーンショット 2024-09-18 14.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/106cab88-2a15-b4d0-13ff-3333dc4be634.png)