Friction River Software

  • お問い合わせ

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

B美

んじゃ、なにはともあれ「データベース」が必要だから、そこから設計していきましょう

A子

詳細設計まで一気に進めちゃうの?

B美

ええ
CakePHP」を利用するなら、それが一番効率的ね

C菜

掲示板への投稿を格納するためのテーブルと、アクセスログを記録するためのテーブルの二つがあれば良いんですよね~?

A子

…と思うけどね(チラッ)

B美

私をチラ見すんなや(苦笑)

問題があったら適当に口をはさむから、あなたたちの思ったようにやりなさい

C菜

それじゃあ、まずは名前を決めましょう~

データベース名」と二つの「テーブル名」ですね~

A子

うーん、掲示板は英語で「BBS」だから、データベース名は「bbsdb」にしよう

投稿を格納するテーブルの名前は「toukou」、アクセスログのテーブル名は「log」で良いんじゃない?

C菜

え~
ローマ字はダサいですぅ~

英語にしましょうよ~
投稿用のテーブル名は「post」でどうですか~?

A子

ダサいのか…
ま、まぁそれでも良いでしょう

んじゃ、名前はそれで決まりね

B美

ちょっと口を出させてもらうわよ

データベース名はそれで問題ないけど、テーブル名のほうは「複数形」にしてね
つまり、「posts」と「logs」ね

A子

え?
なんでよ

B美

「CakePHP」における単なる「命名規則」ってこと

あ、複数の単語を組み合わせる場合は「スネークケース」でお願いね
(例えば「access_logs」って感じで…)

C菜

分かりました~

次は、テーブル設計ですね~

A子

以前(開発環境構築編④)作った下記を参考にして、書き換えよう

create database testdb;

use testdb;

create table counters (
 id int auto_increment primary key,
 remarks varchar(255),
 counter int not null,
 created datetime,
 modified datetime
) charset=utf8mb4;

insert into counters values (1,'top',0,now(),now());

C菜

えっと~

create database bbsdb;

use bbsdb;

create table posts (
 ・・・
 (ここに項目を記述)
 ・・・
) charset=utf8mb4;

create table logs (
 ・・・
 (ここに項目を記述)
 ・・・
) charset=utf8mb4;

…で良いでしょうか~?

B美

良い感じなんだけど、各テーブルの先頭に「id」、末尾に「created」と「modified」を必ず記述してね
(もともとのやつのコピペで良いから…)

A子

…ってことは

create database bbsdb;

use bbsdb;

create table posts (
 id int auto_increment primary key,
 ・・・
 (ここに項目を記述)
 ・・・
 created datetime,
 modified datetime
) charset=utf8mb4;

create table logs (
 id int auto_increment primary key,
 ・・・
 (ここに項目を記述)
 ・・・
 created datetime,
 modified datetime
) charset=utf8mb4;

こういうこと?

C菜

これも「CakePHP」の約束事ってことですか~?

B美

その通り

難しく考えずに、「そういうものだ」と思っておけば良いからね

A子

よし、それじゃテーブルの項目を決めていこう

まずは「posts」からね

C菜

投稿の「タイトル」と「本文」は必須ですね~

あと、アップロードしたファイルの「保存場所」、それと「削除フラグ」ですかね~

A子

えーっと、多分「int」が整数で、「varchar(255)」が文字列だと思うから

create table posts (
 id int auto_increment primary key,
 title varchar(255),
 body varchar(255),
 filepath varchar(255),
 delete_flag int,

 created datetime,
 modified datetime
) charset=utf8mb4;

…で良いのかな?

B美

惜しい点が二つあります

一つは「本文」を格納する項目(「body」という名の項目)のデータ型よ
(「varchar(255)」の「255」って最大文字数なの)

もう一つはファイルの「保存場所」だけじゃなく、(オリジナルの)「ファイル名」も格納しておきたいのよ

いや、アップロードしたファイルが日本語のファイル名だった場合、そのままでは画像ファイルへのリンクを張れないからね
(ファイル保存の際、ファイル名を半角英数字に変えて格納するから、元々のファイル名も残しておきたい…ってわけ)

A子

うーん、なんだかよく分からないけど、「ファイル名」については了解…
(項目を一つ増やせば良いだけよね)

んで、「本文」のほうは「body」のデータ型を「varchar(100000)」とかにすれば良いの?

B美

違う違う

データベースには、大量の文字列を格納するためのデータ型がちゃんと用意されているのよ
(上限設定なしで…)

それが「text」型よ

C菜

ということは~

create table posts (
 id int auto_increment primary key,
 title varchar(255),
 body text,
 filename varchar(255),
 filepath varchar(255),
 delete_flag int,
 created datetime,
 modified datetime
) charset=utf8mb4;

…ってことでしょうか~?

B美

良い感じね

あ、余談だけど「delete_flag」は「int」型(整数型)じゃなくて「boolean」型(論理型)にしてもOKよ
(まぁ、将来の拡張性を考えた場合、「int」型のほうが良いと思うけどね…てか、私ならそうする)

A子

あ、「not null」って必要なの?

B美

その項目を「必須入力」項目にしたければ付けたほうが良いかな

うっかり何も入れずに(NULL値のまま)レコード挿入した場合、エラーを出してくれるからね
(ただし「id」「created」「modified」には付けなくても良いわ)

C菜

だったら「title」と「body」、あと「delete_flag」には必要かも~

A子

ふむ、それじゃこんな感じで…

create table posts (
 id int auto_increment primary key,
 title varchar(255) not null,
 body text not null,
 filename varchar(255),
 filepath varchar(255),
 delete_flag int not null,
 created datetime,
 modified datetime
) charset=utf8mb4;

B美

良いじゃない

次は「logs」テーブルね

C菜

アクセス元の「IPアドレス」と投稿したときの「番号」(「posts」テーブルの「id」の値)があれば良いんですよね~?

create table logs (
 id int auto_increment primary key,
 ip_address varchar(15),
 post_id int not null,

 created datetime,
 modified datetime
) charset=utf8mb4;

…って感じでしょうか~?

「IPアドレス」って「xxx.xxx.xxx.xxx」という形式なので、最大でも15文字ですから~

B美

ギリギリを攻めるのは止めておいたほうが良いわよ(苦笑)

少しは余裕を持たせないと…

A子

それじゃ「ip_address」という項目のデータ型は「varchar(50)」にしよう
(キリの良いところで…)

えーっと、あとは何かあるかな?

B美

テーブルを作った後からでも、項目の「追加」や「削除」は可能だからね

とりあえずは、それでやってみましょう

A子

それじゃ、まとめるよ

create database bbsdb;

use bbsdb;

create table posts (
   id int auto_increment primary key,
   title varchar(255) not null,
   body text not null,
   filename varchar(255),
   filepath varchar(255),
   delete_flag int not null,
   created datetime,
   modified datetime
) charset=utf8mb4;

create table logs (
   id int auto_increment primary key,
   ip_address varchar(50),
   post_id int not null,
   created datetime,
   modified datetime
) charset=utf8mb4;

…ってことになるね

C菜

これをA子社長と二人で作ったなんて、なんだかすごいですぅ~
(B美部長の助言があったとはいえ…)

A子

確かにね

あとは、これを「bbsdb.sql」というファイル名で保存して、「mysql」コマンドを実行すれば良いのよね?

C菜

これも「開発環境構築編④」を参考にするです~

mysql -u root -p < bbsdb.sql[Enter]

で良いはずです~
(もちろん「MATE端末」上で実行です~)

A子

一応、確認してみよう!

mysql -u root -p bbsdb[Enter]

のあと

show fields from posts;[Enter]

を打ち込んでっと…



C菜

問題ないみたいですね~

show fields from logs;[Enter]

も確認するです~

B美

よくできました!(拍手)

それじゃ、次回はいよいよ「CakePHP」のプロジェクトを作っていきましょう
お楽しみにー