Итак, у вас есть иерархия по категориям, да? Это один уровень (категория и категория ребенка) или любое количество (дети могут иметь детей и т. Д.)? Это повлияет на решение.
Как правило, вы бы смоделировали что-то подобное с отношением многих ко многим, например:
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)
)
Это усложняет ситуацию, потому что вы должны использовать рекурсивные запросы, чтобы получить все записи для категории и ее потомков. Проще, если у вас есть только два уровня категорий, просто сделать его вторым полем в таблице категорий, например:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
subcategory_name VARCHAR(255) NULL
)