2010-01-04 6 views
5

J'utilise le modèle de liste d'adjacence pour créer des catégories, et cela fonctionne parfaitement. Lorsque je récupère des articles dans une certaine catégorie (par exemple l'électronique), je souhaite également récupérer les articles dans les sous-catégories (par exemple électronique-> caméras, ou même électronique-> caméras-> objectifs de caméra).Conception de base de données d'un système de catégories arborescentes

La façon dont je le fais maintenant est de tirer de la DB tous les identifiants de catégorie des sous-catégories de l'électronique, et de trouver tous les articles avec un category_id dans cette liste.

Cela me semble très inefficace et prend beaucoup de temps, car cela pourrait entraîner de nombreuses requêtes pour récupérer ces sous-catégories. Une autre façon d'y parvenir est d'avoir tous les articles associés à l'arbre de la catégorie entière (par exemple un article sur les objectifs de la caméra sera également associé aux catégories caméra et électronique dans la table MANY_MANY), et quand je récupère tous les articles en électronique, il apparaîtra aussi.

Cela ajouterait beaucoup de données redondantes à la base de données, car je devrais stocker 3 ou 4 catégories pour chaque article. En outre, cela compliquerait des actions comme le déplacement d'un article vers une autre catégorie.

Est-ce la bonne façon de procéder? Ou y a-t-il un moyen meilleur/plus simple auquel je n'ai pas pensé?

Toute aide appréciée!

+0

La façon dont vous le faites maintenant sonne parfaitement bien, surtout par rapport à la seconde méthode que vous décrivez. –

Répondre

12

Lisez cet article sur la modélisation de l'ensemble imbriqué: Managing Hierarchical Data in MySQL.

En utilisant la technique suggérée, vous pouvez obtenir des arbres entiers ou des sous-arbres entiers dans un seul SELECT. C'est un peu plus compliqué que l'approche "normale", mais ça vaut vraiment la peine si vous allez faire beaucoup de lectures de la table.

+0

J'aime l'article, mais j'ai une question. Supposons que nous ayons un deuxième arbre dans la même table. Lft de la racine serait de 21. Ensuite, nous ajoutons un autre enfant à l'ancien arbre. Cela entraînerait le chevauchement de la racine de cet arbre avec la racine suivante. Comment puis-je résoudre ceci? Je ne voudrais pas renuméroter tous les nœuds à la droite de mon nœud nouvellement inséré. Est-ce le seul moyen? –

+0

Nevermind. Je pense que la section sur l'ajout de nouveaux nœuds est concluante. N'est-ce pas un peu cher cependant? Si vous effectuez un ajout ou un retrait dans l'un des premiers arbres de votre table, vous parcourez presque toute la table pour mettre à jour les valeurs lft et rft. Est-ce généralement accepté? –

+0

Je pense que vous auriez à équilibrer cela pour vous-même: nombre total d'enregistrements * nombre d'écritures/montant des lectures – nickf

Questions connexes