Friction River Software

  • お問い合わせ

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

A子

まずはデータベースだけど、すでに存在する「authdb」とは別に、「chatdb」という名前のデータベースを作ろう
(「認証アプリ」自体は流用するけど、データベースのほうは新たに作成するってこと)

んで、テーブルとしては、(ログイン認証用の「users」とは別に)チャットルームのテーブルと、発言内容のテーブルが必要だね

C菜

チャットルーム情報は「chat_rooms」で、発言内容は「comments」で良いんじゃないですか~?
(どちらも複数形です~)

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菜

まずは「chat_rooms」ですけど~

・テーマ(議題)
・作成者(ユーザID)…管理人となる
・削除フラグ(整数値)

で、どうでしょう~?

A子

OK、OK

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美

その中にある「admin_id」は「外部キー」だから、その定義も入れておきなさいね

具体的には「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子

あっ、「users」テーブルだけどさー
発言者名として「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美

良いんかい!(笑)