CakePHP5入門【CakePHP5実用編②】データベース設計

A子
(「認証アプリ」自体は流用するけど、データベースのほうは新たに作成するってこと)
んで、テーブルとしては、(ログイン認証用の「users」とは別に)チャットルームのテーブルと、発言内容のテーブルが必要だね

C菜
(どちらも複数形です~)

A子
create table chat_rooms (
id int auto_increment primary key, ・・・ (ここに項目を記述) ・・・ created datetime, modified datetime ) charset=utf8mb4; create table comments ( id int auto_increment primary key, ・・・ (ここに項目を記述) ・・・ created datetime, modified datetime ) charset=utf8mb4; |
…が基本形ってことだね

C菜
・テーマ(議題)
・作成者(ユーザID)…管理人となる ・削除フラグ(整数値) |
で、どうでしょう~?

A子
create table chat_rooms (
id int auto_increment primary key, theme varchar(255) not null, admin_id int not null, delete_flag int not null, created datetime, modified datetime ) charset=utf8mb4; |
…って感じかな

B美
具体的には「FOREIGN KEY (外部キー項目) REFERENCES 参照するテーブル名(主キー項目)」って一文を追記するの

C菜
create table chat_rooms (
id int auto_increment primary key, theme varchar(255) not null, admin_id int not null, delete_flag int not null, created datetime, modified datetime ) charset=utf8mb4 foreign key(admin_id) references users(id); |
ということでしょうか~?

B美
テーブル定義の「中に」追記するの
(あたかも項目の一つであるかのようにね)

A子
create table chat_rooms (
id int auto_increment primary key, theme varchar(255) not null, admin_id int not null, delete_flag int not null, created datetime, modified datetime, foreign key(admin_id) references users(id) ) charset=utf8mb4; |
で、どうよ

B美
てか、「modified datetime」のあとに,を付け忘れなかったことについては、「よく気付いた」と褒めてあげましょう

A子
んじゃ、次は発言を格納するための「comments」テーブルだね

C菜
・発言内容(text型)
・発言者(ユーザID) ・チャットルーム番号(チャットルームID) |
などがあれば、良いんじゃないでしょうか~?

A子
create table comments (
id int auto_increment primary key, content text, user_id int not null, room_id int not null, created datetime, modified datetime, foreign key(user_id) references users(id), foreign key(room_id) references chat_rooms(id) ) charset=utf8mb4; |
で良いんじゃない?

B美
では総まとめとして、「create database」から始めて、「users」テーブルの定義も含め、全てを記述してみなさい
(要するに、本番環境への設置用)

C菜
create database chatdb;
use chatdb; create table users ( id int auto_increment primary key, email varchar(255), password varchar(255), status int, session varchar(255), login_time datetime, logout_time datetime, created datetime, modified datetime ); create table chat_rooms ( id int auto_increment primary key, theme varchar(255) not null, admin_id int not null, delete_flag int not null, created datetime, modified datetime, foreign key(admin_id) references users(id) ) charset=utf8mb4; create table comments ( id int auto_increment primary key, content text, user_id int not null, room_id int not null, created datetime, modified datetime, foreign key(user_id) references users(id), foreign key(room_id) references chat_rooms(id) ) charset=utf8mb4; |
ですね~

A子
発言者名として「email」を使う場合、(長ったらしいし)分かりにくいよ
ハンドルネームの項目を追加しよう
(ユーザ管理画面等を変更しなきゃいけないのが面倒だけど…(苦笑))

C菜
create database chatdb;
use chatdb; create table users ( id int auto_increment primary key, email varchar(255), password varchar(255), handle_name varchar(255), status int, session varchar(255), login_time datetime, logout_time datetime, created datetime, modified datetime ); create table chat_rooms ( id int auto_increment primary key, theme varchar(255) not null, admin_id int not null, delete_flag int not null, created datetime, modified datetime, foreign key(admin_id) references users(id) ) charset=utf8mb4; create table comments ( id int auto_increment primary key, content text, user_id int not null, room_id int not null, created datetime, modified datetime, foreign key(user_id) references users(id), foreign key(room_id) references chat_rooms(id) ) charset=utf8mb4; |
で、どうでしょう~?

B美
おそらく先々、新たな項目を追加することになるかもしれないけど…(苦笑)
(あと、項目名の付け方もちょっと…)←これに関しては次々回に問題点を指摘予定
んじゃ、次回は「users」テーブルにハンドルネーム(handle_name)を追加したことに伴うコード変更をやってみなさい

A子
まぁ、良いか

B美