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 |
リレーション
データ例
階層構造の例
| 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情報
- 表示設定: カテゴリ別の表示方法(一覧/グリッド等)