2008-12-15 9 views
3

Je fais la liste des articles dans les catégories, le problème est que cet article peut être dans plusieurs catégories. Quelle est votre meilleure pratique pour stocker des éléments dans des catégories et comment lister tous les éléments dans la catégorie et ses catégories enfants? J'utilise Zend Framework et MySQL pour résoudre ce problème.Articles de plusieurs catégories de bonnes pratiques

Merci pour vos réponses.

Désolé pour mon anglais :)

Répondre

8

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 
) 
+0

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". –

3

si un élément peut être dans plusieurs catégories, celles-ci ne sont pas des « catégories '. ils sont plus comme des étiquettes.

Utilisez les relations plusieurs-à-plusieurs entre vos éléments et vos tags. si vous voulez une hiérarchie de tags, allez-y; mais il est généralement exagéré et ajoute très rarement de la valeur.

0

Généralement, la meilleure solution que j'ai trouvée qui fonctionne dans la plupart des situations consiste simplement à utiliser un champ parent_id dans votre tableau de catégories. De cette façon, vous n'aurez besoin que d'une table de catégories. Cela prendra en charge n'importe quel nombre de niveaux ou un seul si vous voulez (dans ce cas, la capacité de créer un troisième niveau de catégorie devrait être évitée dans votre code).

Par exemple:
CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT, parent_id INT NOT NULL DEFAULT '0' name VARCHAR(255) NOT NULL ) C'est plus simple. Toute catégorie avec un parent_id de 0 sera votre niveau le plus élevé. Si vous avez une catégorie dont l'identifiant est 1 et que vous créez une sous-catégorie de cela, parent_id sera 1 etc.

Questions connexes