LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-10

やっとできたぞER図!

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

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

08.png

人生初のちゃんと書いたぞ(書けたのか?)ER図!
これでMySQLにデータベースが作れる!

ER図の作成の手順おさらい

  1. テーブルを作成する
  2. テーブルにカラムを設定する
  3. テーブル同士のリレーションシップを設定する

メモ

テーブルを繋ぐリレーションシップの1:1, 1:nの振り方にまだ不安があり

慣れなんでしょうけどどっちがどっちに対する依存?なのかが概念としてつかめていない。
(ちなみにこのworkbenchの書き方カラスの足みたいなのでcrow's footとか呼ぶらしい)
決まっているもの1に対しての追加されていくものが多?引き続き勉強する
09.png
マウスオーバーするとこのように関係性が色で出るのでこれみながらつかむ

主キーはテーブルごとに必ず入れる

入れないケースは無くはないけれど、少ないそうで。
入れておいた方があとで修正するときなど、何かと便利

別テーブルにするもののコツ

「種別」のように決まり切ったものは切り離すとやりやすい。
変更も加えやすい
(もっとはっきり書きたいけどつかみきれてないなこれは)

誰が何をどうしたか

意識する

実際にターミナルでDBに突っ込んでみよう

10.png

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

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

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行目まで削除!

  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

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にはいるぞ

mysql -uroot -proot

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

use DB名);

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

全部作成したら確認!

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)

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

今回はここまで。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0