Donc, vous avez une hiérarchie dans les catégories, oui? S'agit-il d'un niveau (catégorie et catégorie enfant) ou d'un nombre quelconque (les enfants peuvent avoir des enfants, etc.)? Cela aura une incidence sur la solution.
En général, vous voulez modéliser quelque chose comme ça avec un grand nombre à plusieurs, comme:
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)
)
Un record dans « Item_Category » signifie que l'élément de la liste est dans la catégorie la liste. Vous pouvez alors faire Jointures entre les 2 (ou 3) de ces tableaux à la liste les éléments qui sont dans les catégories:
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'
Ou quelles catégories un élément a:
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'
S'il y a une hiérarchie dans la catégories, qui pourraient être exprimés en utilisant une relation récursive dans la table de catégorie, tels que:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
parent_category_id INT NOT NULL REFERENCES Category(category_id)
)
cela rend les choses plus compliquées parce que vous devez utiliser des requêtes récursives pour obtenir toutes les rec ords pour une catégorie et ses enfants. Une façon plus simple, si vous avez seulement deux niveaux de catégories, pour faire simplement un deuxième champ sur la table des catégories, comme:
CREATE TABLE Category(
category_id INT NOT NULL,
category_name VARCHAR(255) NOT NULL,
subcategory_name VARCHAR(255) NULL
)
Et pour être clair, sur cette dernière version de la table Category, il y a un enregistrement * par sous-catégorie *. Donc, vraiment, il devrait être appelé la table sous-catégorie, avec un PK de "subcategory_id". –