カテゴリのアイテムのリストを作成していますが、問題はアイテムが複数のカテゴリに属する可能性があることです。アイテムをカテゴリに格納するためのベスト プラクティスは何ですか?また、カテゴリとその子カテゴリ内のすべてのアイテムをどのようにリストしますか? この問題を解決するために Zend Framework と MySQL を使用しています。
返信ありがとうございます。
私の英語でごめんなさい:)
カテゴリのアイテムのリストを作成していますが、問題はアイテムが複数のカテゴリに属する可能性があることです。アイテムをカテゴリに格納するためのベスト プラクティスは何ですか?また、カテゴリとその子カテゴリ内のすべてのアイテムをどのようにリストしますか? この問題を解決するために Zend Framework と MySQL を使用しています。
返信ありがとうございます。
私の英語でごめんなさい:)
カテゴリーにヒエラルキーがありますよね?1 つのレベル (カテゴリと子カテゴリ) または任意の数 (子は子を持つことができるなど) ですか? それは、解決策が何であるかに影響します。
一般に、次のような多対多の関係を使用して、次のようなモデルを作成します。
CREATE TABLE Item(
item_id INT NOT NULL,
item_name VARCHAR(255) NOT NULL
)
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL
)
CREATE TABLE Item_Category(
item_id INT NOT NULL REFERENCES Item(item_id),
category_id INT NOT NULL REFERENCES Category(category_id)
)
「Item_Category」のレコードは、リストされたアイテムがリストされたカテゴリにあることを意味します。次に、これらのテーブルの 2 つ (または 3 つ) を結合して、どの項目がどのカテゴリにあるかを一覧表示できます。
SELECT I.*
FROM Item I
INNER JOIN Item_Category IC ON I.item_id = IC.item_id
INNER JOIN Category C on IC.category_id = C.category_id
WHERE
C.category_name = 'MyCategory'
または、アイテムのカテゴリは次のとおりです。
SELECT C.*
FROM Category C
INNER JOIN Item_Category IC.category_id = C.category_id
INNER JOIN Item I on IC.item_id = I.item_id
WHERE
I.item_name = 'MyItem'
カテゴリに階層がある場合、次のように、カテゴリ テーブルで再帰的な関係を使用して表現できます。
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
parent_category_id INT NOT NULL REFERENCES Category(category_id)
)
カテゴリとその子のすべてのレコードを取得するには、再帰クエリを使用する必要があるため、事態はさらに複雑になります。より簡単な方法として、カテゴリが 2 レベルしかない場合は、次のようにカテゴリ テーブルの 2 番目のフィールドにするだけです。
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
subcategory_name VARCHAR(255) NULL
)
アイテムが複数のカテゴリに属する場合、これらは「カテゴリ」ではありません。それらはタグに似ています。
アイテムとタグの間に多対多の関係を使用します。タグの階層が必要な場合は、それを選択してください。しかし、それは通常やり過ぎであり、付加価値をもたらすことはめったにありません。
通常、ほとんどの状況で機能することがわかった最善の解決策は、単にカテゴリ テーブルでparent_id フィールドを使用することです。そうすれば、必要なカテゴリ テーブルは 1 つだけになります。これは、任意の数のレベルをサポートするか、必要に応じて 1 つだけをサポートします (その場合、コードで 3 番目のレベルのカテゴリを作成する機能を防止する必要があります)。
例:
CREATE TABLE category (
id INT NOT NULL AUTO_INCREMENT,
parent_id INT NOT NULL DEFAULT '0'
name VARCHAR(255) NOT NULL
)
その方が簡単です。parent_id が 0 のカテゴリは、最上位レベルになります。ID が 1 のカテゴリがあり、そのサブカテゴリを作成すると、parent_id は 1 などになります。