Question

Le problème que j'ai est le suivant: Le fournisseur de mon entreprise nous fournit une base de données Access (que j'importe dans SQL Server) contenant les informations sur leurs produits (l'alternative consiste à utiliser XML), et j'essaie de transformer cela en une format plus utilisable pour une utilisation dans un site Web de commerce électronique.

Le problème que j'ai rencontré, et peut-être que je ne pense tout simplement pas clairement, est que leurs informations de catégorie peuvent être comprises entre 3 et 6 sous-catégories; il y a toujours au moins 2 catégories (une catégorie parent de niveau supérieur et une sous-catégorie plus spécifique), mais il peut y en avoir jusqu'à 6 en fonction de l'élément.

Leurs données me sont fournies dans la structure de tableau suivante:

CREATE TABLE [dbo].[ECDB2_HIERARCHY](
    [SEQ_ID] [int] NOT NULL,
    [PFX_NUM] [nvarchar](3) NOT NULL,
    [STK_NUM] [nvarchar](12) NOT NULL,
    [ECDB2_LVL_1] [nvarchar](max)  NULL,
    [ECDB2_LVL_1_ID] [int] NULL,
    [ECDB2_LVL_2] [nvarchar](max) NULL,
    [ECDB2_LVL_2_ID] [int] NULL,
    [ECDB2_LVL_3] [nvarchar](max) NULL,
    [ECDB2_LVL_3_ID] [int] NULL,
    [ECDB2_LVL_4] [nvarchar](max) NULL,
    [ECDB2_LVL_4_ID] [int] NULL,
    [ECDB2_LVL_5] [nvarchar](max) NULL,
    [ECDB2_LVL_5_ID] [int] NULL,
    [ECDB2_LVL_6] [nvarchar](max) NULL,
    [ECDB2_LVL_6_ID] [int] NULL

Pour la plupart, je peux ignorer SEQ_ID car il n'est pas utilisé; PFX_NUM et STK_NUM sont concaténés pour former le SKU du produit, mais ce n'est pas le problème. Je dois pouvoir parcourir dynamiquement les catégories du site. Par exemple, à partir de la ligne suivante:

SEQ_ID: 364867 (ignoré)

PFX_NUM: AMP

STK_NUM: 73121

ECDB2_LVL_1: Fournitures de bureau

ECDB2_LVL_1_ID 11

ECDB2_LVL_2: Enveloppes, mailers & amp; Fournitures d'expédition

ECBD2_LVL_2_ID: 26

ECDB2_LVL_3: Enveloppes

ECDB2_LVL_3_ID: 195

ECDB2_LVL_4: Enveloppes de lettre professionnelle

ECDB2_LVL_4_ID: 795

ECDB2_LVL_5: (vide)

ECDB2_LVL_5_ID: 0

ECDB2_LVL_6: (vide)

ECDB2_LVL_6_ID: 0

L'utilisateur devrait pouvoir naviguer dans les niveaux, mais ce qui me dérange, c'est l'exemple de site Web fourni avec les données (voir ci-dessous) qui affiche tous les éléments d'une sous-catégorie à intervalles aléatoires ... il semble que ce soit au 3e level (ecdb2_lvl_3) mais pour les éléments qui n'ont pas le 3ème niveau, il commence à partir du 2ème. Comme vous pouvez le constater, ils ont tout rassemblé dans un tableau qui répertorie les produits ET toutes les catégories auxquelles ils appartiennent, au lieu de créer un tableau de catégories auto-référencé, puis un tableau de produits de jonction.

Le problème est que certains éléments ne possèdent que 2 niveaux, certains comme celui-ci en ont jusqu'à 4 et il en existe quelques-uns qui ont tous les 6 - le site Web exemple du fournisseur, disponible à http://www.biggestbook.com fait un bon travail, mais je n'ai pas accès à leur code, je suis donc obligé de gratter ma tête quant à la façon exacte, ils retirent les catégories et les traverser. Je suppose qu'ils ont une sorte d'indicateur global pour indiquer le niveau actuel (par exemple, 1 pour les fournitures de bureau, 2 pour les enveloppes et autres, etc.) afin qu'ils puissent garder une trace de votre profondeur actuelle, et Ensuite, vérifiez chaque sous-niveau pour voir s'il y a plus de sous-catégories à afficher, mais je fais un vide quand je pense à la façon de gérer cela efficacement. Leur système de nommage laisse aussi beaucoup à désirer, mais c’est quelque chose que je pourrai aborder plus tard si besoin est.

Quelqu'un a-t-il des conseils pour résoudre ce problème? Je planifie le magasin en C # / ASP.NET (éventuellement avec MVC, probablement pas), de sorte que les exemples en C # seraient très utiles, mais je peux suivre la plupart des langues assez facilement pour le comprendre.

Était-ce utile?

La solution

Si l'utilisation de fonctions récursives pour parcourir une table de catégories à auto-référencement ne vous dérange pas, reconfigurez définitivement la base de données pour s'y rendre. On pourrait penser qu’une fonction récursive dans SQL pourrait être un suicide de performances, mais si elle est configurée avec les index appropriés, elle peut être extrêmement rapide.

En ce qui concerne l'ensemble de données avec lequel vous travaillez, vous pouvez voir sur l'exemple de site Web qu'ils stockent la catégorie actuelle dans la requête d'URL:

Fournitures de bureau > Enveloppes, mailers et amp; Fournitures d'expédition > Enveloppes
? N = 4294858589 & amp; ...

Fournitures de bureau > Enveloppes, mailers et amp; Fournitures d'expédition > Enveloppes > Livret & amp; Enveloppes de catalogue
? N = 4294858588 & amp; ...

Où N est la catégorie actuelle. Je penserais que leur base de données a une table de consultation pour voir à quel niveau appartient N. Alternativement, ils pourraient simplement faire une grosse clause WHERE / ORDER BY comme:

WHERE (ECDB2_LVL_1_ID == @N) OR (ECDB2_LVL_2_ID == @N) OR (ECDB2_LVL_3_ID == @N) ...
ORDER BY ECDB2_LVL_1_ID, ECDB2_LVL_2_ID, ECDB2_LVL_3_ID...

Si N est une catégorie de niveau 2, les produits qui n’ont pas de catégorie de niveau 3 apparaîtront en premier car la valeur null atteint le sommet lors du tri.

En passant, ils gardent une trace de la catégorie que vous avez traversée pour atteindre un produit de la session. Suivez une catégorie jusqu'à un produit jusqu'à ce que l'URL indique quelque chose comme? R = 12345. La chapelure indique la catégorie utilisée pour trouver ce produit. Supprimez vos cookies et actualisez la page, la chapelure se transformera en Biggest Book > Détail du produit. Ce n'est pas très utile pour les personnes qui consultent la page à partir d'un moteur de recherche, car elles ne peuvent alors pas sélectionner facilement une catégorie pour voir quels produits similaires sont disponibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top