こんにちは!
Nishiです。前回はMagentoのカテゴリの作成方法の記事を書きました。
今回は、「Magentoのカテゴリデータが、実際にはどこに・どのように保存されているのか」
について書いていきたいと思います。
カテゴリデータを管理する主要テーブル
Magentoのカテゴリは、1つのテーブルだけで管理されているわけではありません。
主に、以下のテーブルが関係しています。
- catalog_category_entity
- catalog_category_entity_*
(datetime, decimal, int, text, varchar 等
※属性のデータ型ごとにテーブルが分かれています。) - eav_attribute
一見するとテーブルが分かれていて分かりづらそうですが、
これは EAV(Entity-Attribute-Value)構造 を採用しているためです。
まずは、それぞれの役割を簡単に見ていきたいと思います。
catalog_category_entity テーブルに保存されているもの
catalog_category_entity テーブルは、カテゴリの「骨組み」 を管理するテーブルです。
ここには、次のような情報が保存されています。
- entity_id:カテゴリID
- attribute_set_id:属性セットのID
- parent_id:親カテゴリID
- path:カテゴリツリー上の位置
- level:階層の深さ
- position:同階層内での並び順
- children_count:子カテゴリの数
- created_at, updated_at:作成日時、更新日時
つまりこのテーブルは、
カテゴリがどこに属し、どんな構造を持っているかを管理しています。
管理画面で設定したカテゴリ情報はどこに保存されるのか
catalog_category_entity テーブルには、
管理画面で設定した カテゴリ名(name)や有効/無効(is_active)といった項目は、
保存されていません。
ここで重要になるのが EAV構造 です。
Magentoでは、カテゴリや商品などのエンティティを柔軟に拡張できるよう、
次の3つを分離して管理しています。
・エンティティ(Entity)
・属性(Attribute)
・値(Value)
そのため、カテゴリ名、表示設定、メタ情報 といった属性ごとの値は、
catalog_category_entity テーブルではなく、属性ごと・データ型ごとに分かれたテーブルに保存されます。
文章だけだと少し分かりにくいため、
カテゴリ周りのテーブル構造を図で整理してみます。
※ 矢印は「外部キーを持つテーブル → 参照先」を表しています。
[補足]
今回の記事では、catalog_category_entity_* テーブルと catalog_category_entity テーブルを紐付けるカラムとして entity_id を使用します。
これは、Magento Open Source にはステージング機能がないためです。
一方、Adobe Commerce ではステージング機能に対応しているため、紐付けには row_id が使用されます。
EAV構造でカテゴリ名が保存される仕組み
例えば、カテゴリ名(name)は文字列属性のため、catalog_category_entity_varcharテーブルに保存されます。
このテーブルは、「どのカテゴリの、どの属性の、どのスコープの値か」を管理するために、
次のようなカラムを持っています。
- value_id:レコードのID
- entity_id:対象カテゴリのID(catalog_category_entity.entity_id を参照)
- attribute_id:対象属性のID(eav_attribute.attribute_id を参照)
- store_id:対象ストアビューのID(store.store_id を参照)
- value:実際の値
このように、
entity_id・attribute_id・store_id の組み合わせによって、1つの属性値が特定されます。
attribute_id とは
attribute_id は、「この行がどの属性の値なのか」を表すIDです。
たとえば、
・name
・is_active
・description
といった属性は、すべて eav_attribute テーブルで管理されています。
catalog_category_entity_varchar の attribute_id は、
この eav_attribute.attribute_id と参照することで、
「この value は カテゴリ名 である」と判別できるようになっています。
store_id とスコープの関係
store_id は、どのスコープの値かを表しています。
(スコープの詳細については、以前の記事「Magentoのスコープとは?」で解説しています)
・store_id = 0
→ グローバル(デフォルト)値
・store_id ≠ 0
→ ストアビューごとの値
管理画面で「Use Default Value」にチェックを入れている場合、対象ストアビュー用のレコードは作成されず、store_id = 0 の値が参照されます。
また、チェックを外して値を入力すると、対象ストアビューの store_id で新しいレコードが保存されます。
最後に
Magentoでは、カテゴリの「構造」と「値」を別々のテーブルで管理しています。
catalog_category_entity は構造を、
カテゴリ名や設定値は属性ごとのテーブルを見る、という点を覚えておくと
DBを直接確認する際に迷いにくくなります。

