2010-06-25 7 views
1

Je construis un site Web de panier et en utilisant des tables SQLproduits de la recherche avec des catégories parent et enfant

CATÉGORIE

Id int, 
Parent_Id, 
Description varchar(100) 

données:

1 0 Electronics 
2 0 Furniture 
3 1 TVs 
4 3 LCD 
5 4 40 inches 
6 4 42 inches 

PRODUITS

Id int, 
Category_Id int 
Description... 

Data:

1 5 New Samsung 40in LCD TV 
2 6 Sony 42in LCD TV 

Comme vous pouvez le voir, je n'ai une colonne pour la dernière catégorie enfant

Maintenant ce que je dois faire est la recherche par catégorie principale à la page d'accueil, par exemple, si l'utilisateur clique pour Electronics, montrer à la fois Les téléviseurs ont un ID Parent-Parent-Parent chez Electronics, en gardant à l'esprit que la table Products n'a qu'une seule colonne pour Category. Dois-je mettre à jour la table des produits et inclure 6 colonnes pour les catégories childs afin de résoudre ce problème? Ou comment puis-je créer une procédure stockée SQL efficace pour cela?

Merci

Jerry

+0

Quel type de base de données et quelle version? –

Répondre

1

dans Oracle, utilisez CONNECT BY

+0

Merci pour l'erreur, malheureusement je n'ai pas Oracle –

0

Si vous utilisez SQL Server 2008, vous voudrez peut-être regarder le type de données hierarchyid. Sinon, vous pouvez envisager de modifier la table Category. Comment vous l'avez modélisé maintenant, vous devez utiliser la récursivité pour obtenir des notes des enfants aux parents ou des parents à travers les enfants. Au lieu d'utiliser le modèle de liste chaînée (ce que vous avez), vous pouvez utiliser le modèle de jeu imbriqué pour les hiérarchies. Faites une recherche sur Joe Celko et Nested Set Model et vous devriez être capable de trouver de bonnes descriptions. Il a également écrit an entire book on modeling trees and hierarchies in SQL. Le modèle de jeu imbriqué nécessite un peu de configuration pour conserver les données, mais il est beaucoup plus facile de travailler avec lors de la sélection des données. Puisque vos catégories resteront probablement relativement stables, cela semble être une bonne solution.

EDIT: Pour réellement répondre à votre question ... vous pouvez écrire une procédure stockée qui se trouve dans une boucle WHILE, en sélectionnant des enfants et en recueillant tous les produits trouvés dans une variable de table. Vérifiez @@ ROWCOUNT dans chaque boucle et si c'est 0 alors vous avez atteint la fin. Ensuite, vous sélectionnez simplement à partir de votre variable de table. C'est une méthode récursive (et lente), c'est pourquoi ce type de modèle ne fonctionne pas très bien dans beaucoup de cas en SQL.

Dans la plupart des cas, vous ne devez ajouter que 6 (ou 7 ou 8) identifiants de catégorie à votre tableau de produits. Mal. Mal. Mal. Ce sera un cauchemar d'entretien entre autres (ce qui se passe lorsque vos catégories vont 7 niveaux de profondeur ... puis 8 ... puis 9.

Questions connexes