自動販売機を作ってみよう part7 - DB設計 答え合わせ編2

# やっとできたぞER図！

前回、ER図書くところまで到達できなかった（MySQLの基本的な書き方がわからなかったので）
そこを勉強しなおして、かけるようになりました。

それで書いてみたER図がこちら。

<img width="734" alt="08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318674/07cab241-8016-49bb-594e-6f3899d6bc62.png">

人生初のちゃんと書いたぞ（書けたのか？）ER図！
これでMySQLにデータベースが作れる！

#### ER図の作成の手順おさらい
1. テーブルを作成する
2. テーブルにカラムを設定する
3. テーブル同士のリレーションシップを設定する

## メモ
##### テーブルを繋ぐリレーションシップの1:1, 1:nの振り方にまだ不安があり
慣れなんでしょうけどどっちがどっちに対する依存？なのかが概念としてつかめていない。
（ちなみにこのworkbenchの書き方カラスの足みたいなのでcrow's footとか呼ぶらしい）
決まっているもの1に対しての追加されていくものが多？引き続き勉強する
<img width="464" alt="09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318674/df9fa57e-b7ec-8c22-b9c7-caf6f78dc55b.png">
マウスオーバーするとこのように関係性が色で出るのでこれみながらつかむ

##### 主キーはテーブルごとに必ず入れる
入れないケースは無くはないけれど、少ないそうで。
入れておいた方があとで修正するときなど、何かと便利

##### 別テーブルにするもののコツ
「種別」のように決まり切ったものは切り離すとやりやすい。
変更も加えやすい
（もっとはっきり書きたいけどつかみきれてないなこれは）

##### 誰が何をどうしたか
意識する

## 実際にターミナルでDBに突っ込んでみよう
<img width="395" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318674/c2f97388-2b9a-5278-6ee3-f0383113c98d.png">


コピーしたいテーブルを右クリック。
'copy SQL to Clipboard'　をクリック
これでコードがクリップボードにコピーされました。

適当なエディタに貼り付けてみる

~~~sql
CREATE TABLE IF NOT EXISTS `mydb`.`otsuka_item` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `name` VARCHAR(45) NOT NULL COMMENT '商品名',
  `price` INT UNSIGNED NOT NULL COMMENT '価格',
  `stock` INT UNSIGNED NULL COMMENT '在庫数',
  `created_at` DATETIME NOT NULL COMMENT '作成日時',
  `updated_at` DATETIME NOT NULL COMMENT '更新日時',
  `deleted_at` DATETIME NOT NULL COMMENT '削除日時',
  `temparature_id` INT NOT NULL,
  `package_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC) VISIBLE,
  UNIQUE INDEX `price_UNIQUE` (`price` ASC) VISIBLE,
  INDEX `fk_item_temparature1_idx` (`temparature_id` ASC) VISIBLE,
  INDEX `fk_item_package1_idx` (`package_id` ASC) VISIBLE,
  CONSTRAINT `fk_item_temparature1`
    FOREIGN KEY (`temparature_id`)
    REFERENCES `mydb`.`otsuka_temparature` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_item_package1`
    FOREIGN KEY (`package_id`)
    REFERENCES `mydb`.`otsuka_package` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
COMMENT = '商品'
~~~

必要な部分だけにする
一行目の

~~~
`mydb`.
~~~

12行目〜25行目まで削除！

~~~sql
  UNIQUE INDEX `name_UNIQUE` (`name` ASC) VISIBLE,
  UNIQUE INDEX `price_UNIQUE` (`price` ASC) VISIBLE,
  INDEX `fk_item_temparature1_idx` (`temparature_id` ASC) VISIBLE,
  INDEX `fk_item_package1_idx` (`package_id` ASC) VISIBLE,
  CONSTRAINT `fk_item_temparature1`
    FOREIGN KEY (`temparature_id`)
    REFERENCES `mydb`.`otsuka_temparature` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_item_package1`
    FOREIGN KEY (`package_id`)
    REFERENCES `mydb`.`otsuka_package` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
~~~

こんな風になったらおk

~~~sql
CREATE TABLE IF NOT EXISTS `otsuka_item` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `name` VARCHAR(45) NOT NULL COMMENT '商品名',
  `price` INT UNSIGNED NOT NULL COMMENT '価格',
  `stock` INT UNSIGNED NULL COMMENT '在庫数',
  `created_at` DATETIME NOT NULL COMMENT '作成日時',
  `updated_at` DATETIME NOT NULL COMMENT '更新日時',
  `deleted_at` DATETIME NOT NULL COMMENT '削除日時',
  `temparature_id` INT NOT NULL,
  `package_id` INT NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
COMMENT = '商品';
~~~

他のテーブルも同様の形式にしておく。

## 久々のターミナル

dockerに入る（前にMySQLに直接入ろうとしてしまい、linux環境にもMySQLが入っていたためめちゃくちゃハマってしまった。できないできないで1日使ってもうたorz）

~~~
docker-compose start
~~~

以下を打ち込んでroot@80fb78aabf71:/# になる（よくわかってないぞ）

~~~
docker-compose exec db  bash
~~~

MySQLにはいるぞ

~~~sh
mysql -uroot -proot
~~~

使うデータベースを選ぶぞ

~~~sql
use （DB名）;
~~~

やっとここまできて、先ほどまとめたCREATE〜以下を打ち込む。
するとテーブルが作成されていく。

全部作成したら確認！

~~~console
mysql> show tables
    -> ;
+------------------------+
| Tables_in_******* |
+------------------------+
| otsuka_drink_history   |
| otsuka_item            |
| otsuka_package         |
| otsuka_record          |
| otsuka_temparature     |
| user                   |
| user_detail            |
+------------------------+
7 rows in set (0.00 sec)
~~~

ひとまずこれでテーブルができたぜ！

今回はここまで。