Ikeda's Blog

Laravelでブログサイトを作る 02. データベース設計

おさらい

まとめた要件は、前回を参照。

データベースで管理する情報

親カテゴリ

  • ID
    • 一意となる値です。「どれのこと?」を特定するために利用します。
  • カテゴリ名
    • まず必要なのは、カテゴリの名前です。こればっかりは理由も何も、無ければ話にならないものなので、割愛します。
  • 表示順
    • 一覧表示する上で必要な順序を保有する必要があります。
  • created_at、updated_at、deleted_at
    • LaravelでEloquent ORMを使用する際、順に作成日時更新日時削除日時を格納するために作成します。
    • このうち、削除日時は、「日時が入っていたら削除」と、論理削除のために使用します。

子カテゴリ

  • ID、カテゴリ名、表示順、created_at、updated_at、deleted_at
    • 親カテゴリ同様に、保有する必要がある情報です。
  • 親カテゴリID
    • 子カテゴリには、親に当たる親カテゴリが存在する構成になります。
    • この場合は、親カテゴリのIDと同じ値を格納します。

記事

  • ID、created_at、updated_at、deleted_at
    • この辺りは、親子カテゴリと同様にシステム的に必要な情報です。
  • 記事タイトル
    • 記事のタイトルですが、データベースでは文字数の制限をつけたりはしません。
    • ○文字まで、という制限をデータベース側でやってしまうと、変更する時の手間が大きくなってしまうからです。
  • 記事本文
    • HTMLなどのタグも含めて保存します
  • 親カテゴリID
    • 記事と親カテゴリは1対1の関係にするので、記事情報に親カテゴリを保有させます。
    • (記事に対して複数関連付けるものは子カテゴリ)

記事と子カテゴリを関連付けるテーブル

前述しましたように、1記事に対して複数の子カテゴリが関連付けられるように、記事IDと子カテゴリIDを記録するテーブルを用意します。

まとめ

親カテゴリ(ParentCategory)

カラム名 データ型 index 備考
id int 主キー
name text × カテゴリ名
number int 表示順
created_at timestamp × 作成日時
updated_at timestamp × 更新日時
deleted_at timestamp × 削除日時

※表示順はORDER BYで指定するため、インデックスを作成する。

子カテゴリ(ChildCategory)

カラム名 データ型 index 備考
id int 主キー
name text × カテゴリ名
parent int × 親カテゴリID
number int 表示順
created_at timestamp × 作成日時
updated_at timestamp × 更新日時
deleted_at timestamp × 削除日時

※表示順はORDER BYで指定するため、インデックスを作成する。

記事(article)

カラム名 データ型 index 備考
id int 主キー
title text × 記事タイトル
body text × 本文
parent int 親カテゴリID
created_at timestamp × 作成日時
updated_at timestamp × 更新日時
deleted_at timestamp × 削除日時

※親カテゴリを指定し、属する記事を探すケースがあるので、親カテゴリIDにインデックスを作成する。

記事-子カテゴリ(articleChild)

カラム名 データ型 index 備考
id int 主キー
article int 記事ID
child int 子カテゴリID
created_at timestamp × 作成日時
updated_at timestamp × 更新日時
deleted_at timestamp × 削除日時

※記事が持つ子カテゴリを取得するケースが考えられるので、記事IDにインデックスを作成する。
※子カテゴリを指定し、属する記事を探すケースがあるので、子カテゴリIDにインデックスを作成する。