第9回課題 問2(期末課題企画)の課題に回答してから第11回の課題に進んでください。
Whiteboard(2025.9.12表示のみに変更)のコメントを確認してから第11回の課題に取り組むこと。
○×△貸し出しシステムを期末制作のテーマに選ぶ受講生が多いのですが、講義資料のボードゲームを○×△に置き換えただけでは不足です。
企画に独自の要件を盛り込んで他の受講生のテーブル設計と内容が一致しないように工夫して(独自性を持たせて)下さい。
「ボードゲーム貸し出し管理」「ボードゲームプレイ記録」は簡素なので見本としては見劣りがします。工夫して改善してください。
先に第11回課題2/2の解説から始めています。動画で第10回と言及している部分は第11回に置き換えて視聴して下さい。
2025年度はSQLZOOの復習問題(1/2)は出題していません。
2021年度版解説動画
第9回課題(2/2)「Webclassの第9回課題 問2」の自分の回答と講義担当からのコメントを参考にしてCakePHP用のデータベースを設計する。
SQLのcreate table コマンドをWebclassに記述して回答すること。
CakePHP用のテーブル名、主キー名、外部キー名とキーの設定については第9回の解説を参照。
要点:
テーブル名は複数形 ○○s 例) users
フィールド名は単数形 例) user
テーブル名とフィールド名には小文字を使う。大文字を使わない。 例) 〇 id × ID
主キー名はid
外部キーはテーブル名の単数形_id
中間テーブル名はテーブル名のアルファベット順に「 _ 」で結合
例) ○○s_□□s
※中間テーブルではないテーブルにこの形式の名前を付けるとbakeで不具合が発生する。
英単語を使用する。単語を並べる場合は単語の間は空けない。単語の間に _ (アンダーバー記号)を入れてもよい。
使わない方がよい英単語がある。PHPやSQLの予約語の使用は避ける。
PHPの予約語 use / list / class / return / new / match など
SQLの予約語 action / char / character / limit / index / label / option / value など
MariaDBの型 date / datetime / year など
参考記事:CakePHP3を触ってみました 〜それでも予約語を使いたい〜
第9回課題が未提出の場合:
第9回課題(2/2)と同時に第11回課題(2/2)に回答しても構わない。テーマや設計の変更をする場合は第9回課題も修正して再提出すること。
CakePHPの命名規約について http://qiita.com/nvtomo1029/items/1147b8796af3d906c3a9
データベース列名の名前付け(英単語での)採用例を集めてみた https://qiita.com/otagaisama-1/items/4d7e2eb5c274e9fce664
業務でよく使用するデータベースのテーブルやフィールドの英語名が載っている。
第9回課題 問2(期末課題企画)こばし企画例
「ゼミ室のボードゲームの貸し出し管理(学生対象)」ゲーム、利用者、貸し出し履歴の記録
日を跨いで貸し出しはしない。借りたその日のうちに返却することとする。
デザイナーにはシステム、イラストなどのクレジットを記載。不明の場合はNULL値とする。
ゲームを複数ジャンル(カテゴリー)に登録可能とする。
メーカーが不明の場合はmakersテーブルにメーカー名「不明」を用意して参照する。
利用者(〇id、名前、学籍番号)
メーカー(〇id、名前)
ゲーム(〇id、タイトル、※メーカー_id、デザイナー)
ジャンル(〇id、名前)
ゲーム_ジャンル(〇※ゲーム_id、〇※ジャンル_id)
利用記録(〇id、※利用者_id、※ゲーム_id、利用日時、返却)
これまでの講義でテーブル設計の解説に使用したテーブルの例
テーマ(テーブル名1・テーブル名2...)
学生グループ登録(学生・グループ・学生_グループ)
楽曲評価(利用者・楽曲・評価)
学生名簿(学生・連絡先)
受注管理(顧客・受注・受注詳細・出荷先)
病院診療予約(医師・患者・予約)
履修科目(学生ID・科目・教員)
教科書リスト(科目・教員・教科書)
連絡先共有(教員・学生・連絡手段)
第11回課題 SQLの create table コマンドの回答例
以下をコピペして自分のデータベース用のSQLに修正してOK
書き方 その1 外部キーをひとまとまりに記述
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
student_number VARCHAR(7) NOT NULL UNIQUE KEY
);
CREATE TABLE makers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50) NOT NULL,
maker_id INT NOT NULL,
designer VARCHAR(255),
FOREIGN KEY (maker_id) REFERENCES makers(id)
);
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames_categories (
boardgame_id INT NOT NULL,
category_id INT NOT NULL,
PRIMARY KEY (boardgame_id, category_id),
FOREIGN KEY (boardgame_id) REFERENCES boardgames(id),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
CREATE TABLE usage_records (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
boardgame_id INT NOT NULL,
datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
confirm_return BOOLEAN NOT NULL DEFAULT FALSE,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (boardgame_id) REFERENCES boardgames(id)
);
書き方 その2 フィールドと外部キーをペアで記述
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
student_number VARCHAR(7) NOT NULL UNIQUE KEY
);
CREATE TABLE makers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50) NOT NULL,
maker_id INT NOT NULL,
FOREIGN KEY (maker_id) REFERENCES makers(id),
designer VARCHAR(255)
);
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames_categories (
boardgame_id INT NOT NULL,
FOREIGN KEY (boardgame_id) REFERENCES boardgames(id),
category_id INT NOT NULL,
FOREIGN KEY (category_id) REFERENCES categories(id),
PRIMARY KEY (boardgame_id, category_id)
);
CREATE TABLE usage_records (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
FOREIGN KEY (student_id) REFERENCES students(id),
boardgame_id INT NOT NULL,
FOREIGN KEY (boardgame_id) REFERENCES boardgames(id),
datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
confirm_return BOOLEAN NOT NULL DEFAULT FALSE
);
参考資料: SQL標準のCREATE TABLEの文法では外部キー制約をフィールド定義でREFENCESを指定することで設定できる。MySQLではこの書き方はエラーにはならず単に設定を無視されるので今回の演習ではSQL標準の文法ではなくMySQLの文法を用いる必要がある。
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
student_number VARCHAR(7) NOT NULL UNIQUE KEY
);
CREATE TABLE makers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50) NOT NULL,
maker_id INT NOT NULL REFERENCES makers(id),
designer VARCHAR(255)
);
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE boardgames_categories (
boardgame_id INT NOT NULL REFERENCES boardgames(id),
category_id INT NOT NULL REFERENCES categories(id),
PRIMARY KEY (boardgame_id, category_id)
);
CREATE TABLE usage_records (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL REFERENCES students(id),
boardgame_id INT NOT NULL REFERENCES boardgames(id),
datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
confirm_return BOOLEAN NOT NULL DEFAULT FALSE
);
小文字を使用
禁止ワード
action as by char character class condition date datetime enable for from group index label limit list
match new option order release return select setting use value where year
テーブル名
英単語の複数形 例 users / boxes / categories / companies × user/× box/× category/× companys
複数の単語で構成する場合、単語を_で繋ぐ 例 shift_patterns
フィールド名
英単語の単数形
中間テーブルの名前
テーブルA_テーブルB アルファベット順に並べる
中間テーブルの主キー idではない。table1_id, table2_id の複合キーにする
主キー
id
外部キー
テーブル名の単数形_id
※外部キーのフィールド名で自己参照しないように注意
例)
usersテーブルの主キーはidにする。user_id というフィールド名は使用しない
大学の情報実習室で確認:
xamppで適当にデータベースを作成してphpMyAdminのSQLタブで課題の回答を実行する
エラーが発生したら以下の3点を確認してSQLを修正して再実行する
・文法エラー
・テーブルの作成順序 作成エラーのテーブルの外部キーの参照先のテーブルが存在しているか確認。存在していない場合は先に作成しておく。
・外部キーの参照先のフィールド名を確認 作成しようとしたテーブルか参照先のテーブルのフィールド名を修正して一致させる。
テーブルの修正方法:
phpMyAdminのメニューからフィールド名などを修正
SQLの ALTER TABLEコマンドを使用
テーブルを削除して作成し直す
上記のいずれかで対応する。
自宅などでxamppを利用せずに確認:
phpMyAdminのデモサーバー で Try Demo からSQLでテーブル作成を試す。
利用上の注意
rootユーザのパスワードの変更禁止。
pmaのユーザや権限の変更禁止。
データベースの設定は1時間に1回リセットされる
一週間単位でデータベースは消去される
時間が余ったら、第12回に進んでよい。今回の課題のSQLコマンドを使用して期末課題用データベースを作成する。
または追加課題に取り組む。
残りの時間で以下の課題に取り組む。追加点用の課題とする。第11~15回の演習で時間の余裕があるときに取り組んでおくこと。