Closed fr-sato closed 10 years ago
本課題は13:50開始、工数見積5時間といたします。 よろしくお願いします!
14:05 課題1完了しました。 昼休み後課題2に着手します。
課題2で構築したDBのSQLです。
-- MySQL Script generated by MySQL Workbench
-- 06/05/14 17:26:06
-- Model: New Model Version: 1.0
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`UserData`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`UserData` (
`user_id` INT NOT NULL,
`last_name` TEXT NOT NULL,
`first_name` TEXT NOT NULL,
`email` VARCHAR(255) NOT NULL,
`pref_id` INT NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` TIMESTAMP NULL,
PRIMARY KEY (`user_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`PrefData`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`PrefData` (
`pref_id` INT NOT NULL,
`pref_name` TEXT NOT NULL,
`UserData_user_id` INT NOT NULL,
PRIMARY KEY (`pref_id`, `UserData_user_id`),
INDEX `fk_PrefData_UserData_idx` (`UserData_user_id` ASC),
CONSTRAINT `fk_PrefData_UserData`
FOREIGN KEY (`UserData_user_id`)
REFERENCES `mydb`.`UserData` (`user_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;
確認しました。以下、一部共有漏れもありますが確認と対応をお願いします。 あと、MySQL Workbenchで作成したER図のキャプチャも載せてください。
mydb
の部分は課題で作成したDB名を指定するusers
content_tag
(contentsテーブルとtagsテーブルの中間テーブルの場合)UserData
、PrefData
テーブルの主キーにAUTO_INCREMENT
を付けるUserData
テーブルのupdated_at
はnull不可にする修正致しました!
-- MySQL Script generated by MySQL Workbench
-- 06/05/14 17:57:05
-- Model: New Model Version: 1.0
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mysql_test
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mysql_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mysql_test` ;
-- -----------------------------------------------------
-- Table `mysql_test`.`usersdata`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test`.`usersdata` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`last_name` TEXT NOT NULL,
`first_name` TEXT NOT NULL,
`email` VARCHAR(255) NOT NULL,
`pref_id` INT NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` TIMESTAMP NOT NULL,
PRIMARY KEY (`user_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mysql_test`.`prefdata`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test`.`prefdata` (
`pref_id` INT NOT NULL AUTO_INCREMENT,
`pref_name` TEXT NOT NULL,
`usersdata_user_id` INT NOT NULL,
PRIMARY KEY (`pref_id`, `usersdata_user_id`),
INDEX `fk_prefdata_usersdata_idx` (`usersdata_user_id` ASC),
CONSTRAINT `fk_prefdata_usersdata`
FOREIGN KEY (`usersdata_user_id`)
REFERENCES `mysql_test`.`usersdata` (`user_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;
UserData
をスネークケースで書いた場合、user_data
となります。単語で区切るのが見やすいかなと思います。
で複数形は最後に付くのでuser_datas
と最終的にはなります。
あと、だいたいのテーブルがxxxxx_datas
となってしまい冗長なので、users
とかにしておくと見やすくなります。
あと、中間テーブルは上記のように2つ以上のテーブルで1:N、もしくはN:Nの関係にある場合に用いるテーブルの事です。この場合は、お気に入りユーザーが1会員に対して1:Nの関係にあるため中間テーブルを用いています。
prefdata
にuserdata_user_id
がありますが、user_id
はあくまでusersdata
のIDとしか使わないです。今回の場合はusersdata
とprefdata
の都道府県データを正規化する事で一貫性を保つことが必要になるので再度正規化してみましょう。
再度修正しました!
_data
を消してそれぞれusers
, prefectures
にしました。-- MySQL Script generated by MySQL Workbench
-- 06/06/14 13:55:34
-- Model: New Model Version: 1.0
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mysql_test
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mysql_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mysql_test` ;
-- -----------------------------------------------------
-- Table `mysql_test`.`prefectures`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test`.`prefectures` (
`pref_id` INT NOT NULL AUTO_INCREMENT,
`pref_name` TEXT NOT NULL,
PRIMARY KEY (`pref_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mysql_test`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test`.`users` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`last_name` TEXT NOT NULL,
`first_name` TEXT NOT NULL,
`email` VARCHAR(255) NOT NULL,
`pref_id` INT NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` TIMESTAMP NOT NULL,
PRIMARY KEY (`user_id`),
INDEX `fk_users_prefectures_idx` (`pref_id` ASC),
CONSTRAINT `fk_users_prefectures`
FOREIGN KEY (`pref_id`)
REFERENCES `mysql_test`.`prefectures` (`pref_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;
確認しました。OKです!
以下のテーブルをDB設計ツールを用いて設計してもらいます。
■ユーザー情報
■都道府県情報
■目的
MySQL Workbench を用いてDB設計、SQL化を学びます。
■課題1
公式サイトからMySQL Workbenchをインストールして下さい。
■課題2
MySQL Workbenchを使って課題のテーブルを持つDBを構築して下さい。
構築する際には正規化、外部キー制約など考慮して構築して下さい。
構築し終えたらSQL化しIssueのコメントに記載して下さい。