コンテンツにスキップ

categories テーブル定義

テーブル概要

商品カテゴリを階層構造で管理するテーブルです。既存テーブルを拡張し、無制限階層のカテゴリ構造に対応させています。

テーブル名: categories 説明: カテゴリ(階層構造対応) 用途: 商品の分類管理(ファッション > メンズ > トップス等)

カラム定義

カラム名 NULL デフォルト キー 説明
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PK 主キー
parent_id BIGINT UNSIGNED NULL NULL FK 親カテゴリID(自己参照)
position INT UNSIGNED NOT NULL 0 INDEX 表示順(小さい順)
name VARCHAR(255) NOT NULL - - カテゴリ名
slug VARCHAR(255) NOT NULL - UNIQUE URL用スラッグ
logo_image VARCHAR(255) NULL NULL - ロゴ画像(単一画像)
image JSON NULL NULL - カテゴリ画像(配列、表示順は配列順)
description TEXT NULL NULL - カテゴリ説明
is_active BOOLEAN NOT NULL TRUE INDEX 有効フラグ
created_at TIMESTAMP NULL NULL - 作成日時
updated_at TIMESTAMP NULL NULL - 更新日時

インデックス

種別 名称 対象カラム 説明
PRIMARY KEY pk_categories id 主キー
UNIQUE KEY uk_categories_slug slug URL用スラッグの重複防止
INDEX categories_parent_position_index parent_id, position 親カテゴリ別の表示順
INDEX idx_position position 表示順検索
INDEX idx_is_active is_active 有効フラグ別検索

外部キー制約

名称 対象カラム 参照先 ON DELETE ON UPDATE 説明
fk_categories_parent parent_id categories(id) SET NULL RESTRICT 親カテゴリ削除時はNULL

リレーション

関連先テーブル 関連タイプ 外部キー 参照先 ON DELETE ON UPDATE 説明
categories 1:N id parent_id SET NULL RESTRICT 親カテゴリ(自己参照)
categories N:1 parent_id id 子カテゴリ(自己参照)
category_product_rel 1:N category_id id CASCADE RESTRICT カテゴリ削除時に中間テーブル側も削除
products N:N product_id id (category_product_rel経由) カテゴリは複数の商品を持つ

データ例

階層構造の例

id parent_id position name slug image is_active
1 NULL 1 ファッション fashion ["fashion-main.jpg", "fashion-banner.jpg"] TRUE
2 1 1 メンズ mens ["mens-category.jpg"] TRUE
3 1 2 レディース ladies ["ladies-category.jpg"] TRUE
4 2 1 トップス mens-tops ["mens-tops.jpg"] TRUE
5 2 2 ボトムス mens-bottoms ["mens-bottoms.jpg"] TRUE
6 4 1 Tシャツ mens-t-shirts ["mens-t-shirts.jpg"] TRUE
7 4 2 シャツ mens-shirts ["mens-shirts.jpg"] TRUE

階層構造の可視化

ファッション (position=1, parent_id=NULL)
├─ メンズ (position=1, parent_id=1)
│  ├─ トップス (position=1, parent_id=2)
│  │  ├─ Tシャツ (position=1, parent_id=4)
│  │  └─ シャツ (position=2, parent_id=4)
│  └─ ボトムス (position=2, parent_id=2)
└─ レディース (position=2, parent_id=1)

備考・注意事項

階層管理

position(表示順)

  • 表示順制御: 同じ階層内での表示順を制御
  • ルートカテゴリ: parent_id = NULL
  • 階層の深さ: 制限なし(UI側で警告推奨)

表示順管理

  • position: 同じ階層内での表示順
  • 小さい値が上位に表示
  • 親カテゴリ変更時は子カテゴリの順序も考慮

有効フラグ管理

  • is_active: カテゴリの有効/無効を制御
  • FALSEの場合、フロントエンドで非表示
  • 子カテゴリがある場合は無効化不可(UI側で制御)

削除時の注意

親カテゴリ削除時の制約

外部キー制約: ON DELETE SET NULL

  • 親カテゴリ削除時、子カテゴリのparent_idは自動的にNULLに設定される
  • 子カテゴリ本体は残る(削除されない)
  • 削除手順: 親カテゴリを削除すると、子カテゴリは自動的にルートカテゴリ(parent_id = NULL)になる
  • UI推奨: 削除前に子カテゴリの存在を確認し、警告を出す
  • 例: 「このカテゴリには3つの子カテゴリがあります。親カテゴリを削除すると、子カテゴリはルートカテゴリになります。よろしいですか?」

カテゴリ削除時の商品への影響

外部キー制約: category_product_relテーブルでON DELETE CASCADE

  • カテゴリ削除時、category_product_relの関連レコードは自動削除される
  • 商品本体は残る(削除されない)
  • 商品がそのカテゴリだけに属していた場合、カテゴリなしの商品になる
  • UI推奨: 削除前に所属商品数を表示し、警告を出す
  • 例: 「このカテゴリには5件の商品があります。カテゴリを削除すると、商品からカテゴリが解除されます。よろしいですか?」

パフォーマンス考慮

  • Eager Loading: 一括取得を推奨
  • キャッシュ: 階層構造は頻繁に変更されないためキャッシュ推奨
  • インデックス: parent_id + positionの複合インデックスで高速化

画像管理

  • image: JSON配列(表示順は配列順)
  • カテゴリページのヘッダー画像、バナー画像等に使用
  • 外部テーブル化は行わない(検索が稀なため)
  • 例: ["category-main.jpg", "category-banner.jpg"]

将来の拡張

  • SEO設定: カテゴリ別のmeta情報
  • 表示設定: カテゴリ別の表示方法(一覧/グリッド等)