こんにちは、新人エンジニアのマッヒーです。弊社インスパイアデザインでは月に1回勉強会が実施されており、社長のマーチンさん、ベテランエンジニアのトミーさんのご指導のもと日々勉強させていただいております。
現在私が取り組んでいる課題は、「PHPフレームワークのLaravelを用いてWordPressと同じようなCMSを構築する」というものです。
そこで毎月の勉強会でCMS開発の進捗・成果方向を行っており、その都度トミーさんからアドバイスや次回の課題をいただいています。
つい先日行われた勉強会では、記事とカテゴリー、タグの紐付け機能の実装を行い成果報告をさせていただきました。そこでトミーさんからこのようなアドバイスをいただきました。

1対1の関係のリレーションテーブル基本的には避けるべきです。
テーブルを分けた分だけ参照するテーブルの数が増えてしまうことになるので、ページの読み込み速度を低下させる要因にもなります。
今回のように分ける必要がない場合は1つのテーブルにまとめてしまうのがベストです!
ご指摘頂いた実際のテーブルは以下の記事とカテゴリーの関連付けを行うための relations_categories テーブルです。

記事とカテゴリーの関連付けは1つまで、記事とタグの関連付けは複数可というルールになっています。
なので、entries と relation_categories の関係は1対1となっています。
であれば、entries テーブルに category_id というカラムを設置してしまえば relation_categories テーブルは不要になりますよね。
ということで早速データベースをを再度設計してみました。

おお! relation_categories テーブルが無くなったのでかなりスッキリしました。
では実際にLaravelの方でもデータベースを修正していきたいと思ったのですが、
こんな疑問が生まれました。

entries テーブルに category_id カラムを追加するとなると、entries テーブルを一旦削除して、再度作り直す必要がありそうだな。
でも既存の記事も全て消えてしまうし、どうすれば。。
後からカラムを追加する方法はないのかな?調べてみよう。
調べてみたところなんと、Laravelでは、カラムを後から追加することができるみたいです。

さすがLaravel。。
では実際に作業を行います。
以下のコマンドを実行して、–table オプションにテーブル名を指定したマイグレーションを作成します。
$ php artisan make:migration add_category_id_to_entries --table=entries
作成されたマイグレーションファイルの up メソッドに追加するカラムを指定します。
public function up()
{
Schema::table('entries', function (Blueprint $table) {
// category_idカラムを追加
$table->integer('category_id')->nullable();
});
}
そして、最後に以下のコマンドでマイグレーションを実行するだけで良いみたいです。
$ php artisan migrate
実際にカラムが追加されたかを確認してみたとろこ、以下の以下のようにきちんとカラムが追加されていました。
