MySQL WorkbenchのForward EngineeringでER図から自動でデータベース構築

# 何話す。
MySQL WorkbenchはGUIでMySQLを操作できる公式ツールです。
公式サイト・ダウンロード👉https://www.mysql.com/jp/products/workbench/
これがうんちっち便利でして、このソフト内でER図を作成でき、それをそのまま自動でいい感じにデータベースにしてくれます。この機能をフォワードエンジニアリングと言います。Create Tabeleとか一切書かなくていいんです。
Postgresから浮気しよ

# 環境
- macOS Mojave バーション10.14.6
- MySQL Workbench version8.0.18

# 前提
- MySQLをインストール済み
- MySQL Workbenchをインストール済み

この記事はMySQL Workbenchの使い方記事ではないので、フォワードエンジニアリング以外の使い方は他の記事を参考にしてください。

# 本題
その前に、コマンドラインからMySQLを起動させておいてください。

```bash
mysql.server start
```
## 1.ER図作成
<img width="1440" alt="スクリーンショット 2019-12-29 1.11.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/1e79afba-bea7-377d-f029-74c0f6b8333f.png">
まず起動したらメニューバー[File]から[New Model]へ。

<img width="1440" alt="スクリーンショット 2019-12-29 1.12.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/41b30cee-425a-5a1d-824c-fd5ebe3f0aed.png">
[Add Diagram]をダブルクリックしてER図を新規作成します。

<img width="1440" alt="スクリーンショット 2019-12-29 1.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/df96847d-7308-1e8a-1e4a-970ff0481be1.png">
ER図の作業画面。左側コンテンツバーの表のアイコンをタッチしてから、方眼の上をタッチすると新しいテーブルを出せます。

<img width="1440" alt="スクリーンショット 2019-12-29 1.14.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/93468380-10e1-43e2-4b3e-3f136858751b.png">
出したテーブルをダブルクリックすると下からテーブル名やカラムを編集するバーが登場するので、まあ色々編集します。

<img width="1440" alt="スクリーンショット 2019-12-29 1.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/aae966f2-1f68-1fa9-8976-116a673a0f92.png">
ちなみにテーブル同士を関連で繋ぐときもコンテンツバーの適切な関連アイコンをクリックし、繋げたいテーブルをそれぞれクリックすると関連を作成できます。
この際自動的に外部キーなどは必要なテーブルに生成されます。

<img width="1440" alt="スクリーンショット 2019-12-29 1.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/b7a68573-eead-d5ae-f8a4-5ae5850eed94.png">
適当なER図が完成しました！

## 2.フォワードエンジニアリング

<img width="1440" alt="スクリーンショット 2019-12-29 1.30.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/9405d5f1-eaac-0b38-57df-8f668059de79.png">
さて早速ER図からデータベースを生成したいところですが、まずデータベースの生成先であるインスタンスをMySQLと接続しておきましょう。
先ほどMySQLは起動したので、ホーム画面の右側メニューバー[MySQLマーク]から適当なインスタンス(記事ではデフォルトのやつを使用)をダブルクリックで接続できます。

<img width="1440" alt="スクリーンショット 2019-12-29 1.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/4dd4de59-b67f-ec2a-8181-c896b016089a.png">
接続できたらER図のファイルに戻って、上部メニューバー[Database]から[Forward Engineer...]を選択。

<img width="1440" alt="スクリーンショット 2019-12-29 1.28.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/a617ae8a-8f02-c8ec-ba3c-f9d5eec1a6af.png">
色々出てきますが全部[continue]でOKです。
あ、でもデフォルトのインスタンス使ってない人とかは適宜表示される設定で合わせてください。

<img width="1440" alt="スクリーンショット 2019-12-29 1.37.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/b6368dee-3362-00fe-ae63-2131d6850549.png">
そしてデータベーススキーマを定義するSQLスクリプトが自動生成されました！
以下実際に自動生成されたもの。

```sql:生成されたスクリプト
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`students`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`students` (
  `id` VARCHAR(36) NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `gender` VARCHAR(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`teachers`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`teachers` (
  `id` VARCHAR(36) NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `gender` VARCHAR(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`classes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`classes` (
  `id` VARCHAR(36) NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `day_of_week` VARCHAR(1) NOT NULL,
  `period` INT NOT NULL,
  `year` INT NOT NULL,
  `semester` VARCHAR(1) NOT NULL,
  `teachers_id` VARCHAR(36) NOT NULL,
  PRIMARY KEY (`id`, `teachers_id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
  INDEX `fk_classes_teachers1_idx` (`teachers_id` ASC) VISIBLE,
  CONSTRAINT `fk_classes_teachers1`
    FOREIGN KEY (`teachers_id`)
    REFERENCES `mydb`.`teachers` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`students_classes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`students_classes` (
  `classes_id` VARCHAR(36) NOT NULL,
  `students_id` VARCHAR(36) NOT NULL,
  PRIMARY KEY (`classes_id`, `students_id`),
  INDEX `fk_table1_students1_idx` (`students_id` ASC) VISIBLE,
  CONSTRAINT `fk_table1_classes`
    FOREIGN KEY (`classes_id`)
    REFERENCES `mydb`.`classes` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_table1_students1`
    FOREIGN KEY (`students_id`)
    REFERENCES `mydb`.`students` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

```

<img width="1440" alt="スクリーンショット 2019-12-29 1.39.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/4fd9d6e5-4514-01eb-e83c-42cc684db14a.png">
あとはまた[continue]を押せばもうデータベースが自動生成されました。

このデータベースの生成先であるインスタンスを見に行ってみましょう。

<img width="1440" alt="スクリーンショット 2019-12-29 1.39.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209951/335ac366-9661-0416-d9e8-9f52946d4781.png">
ありましたね。右側のリストのmydbというやつです。ちゃんとテーブルも生成されています。

# まとめ
以上MySQL Workbenchの便利な機能Forward Engineeringを紹介しました。
データベース構築の場面ではER図の作成は自分の頭を整理すためにも、人に説明するためにも有益なものです、この作業だけでデータベースが完成しちゃうのは効率が爆上がりですね。
本番用のデータベース設計をこれで済ませるのはやばそうですが、たたき台を作るという意味ではやはり効率をUPさせてくれるでしょう！