Sie haben also eine Hierarchie in den Kategorien, ja? Ist es eine Ebene (Kategorie und Unterkategorie) oder eine beliebige Anzahl (Kinder können Kinder haben usw.)? Das wird sich auf die Lösung auswirken.
Normalerweise würde man so etwas mit einer Many-to-many-Beziehung modellieren, etwa:
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)
)
Ein Eintrag in "Item_Category" bedeutet, dass der gelistete Artikel in die gelistete Kategorie fällt. Sie können dann Verknüpfungen zwischen 2 (oder 3) dieser Tabellen durchführen, um aufzulisten, welche Artikel in welchen Kategorien sind:
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'
Oder welche Kategorien ein Artikel hat:
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'
Wenn es eine Hierarchie in den Kategorien gibt, könnte dies durch eine rekursive Beziehung in der Kategorietabelle ausgedrückt werden, wie z. B.:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
parent_category_id INT NOT NULL REFERENCES Category(category_id)
)
Das macht die Sache komplizierter, weil Sie rekursive Abfragen verwenden müssen, um alle Datensätze für eine Kategorie und ihre Kinder zu erhalten. Eine einfachere Möglichkeit, wenn Sie nur zwei Ebenen von Kategorien haben, ist es, einfach ein zweites Feld in der Kategorietabelle zu erstellen, wie:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
subcategory_name VARCHAR(255) NULL
)