Domanda

Il problema che ho è il seguente: il fornitore della mia azienda ci fornisce un database di Access (che importa in SQL Server) contenente le informazioni sui loro prodotti (l'alternativa è usare XML), e sto provando a massaggiare questo in un formato più utilizzabile per l'uso in un sito Web di e-commerce.

Il problema che ho riscontrato, e forse non sto pensando chiaramente, è che le informazioni sulla loro categoria possono essere comprese tra 3-6 sottocategorie; ci sono sempre almeno 2 categorie (una categoria principale di livello superiore e una sottocategoria più specifica) ma possono essercene fino a 6 a seconda dell'elemento.

I loro dati mi vengono forniti nella seguente struttura della tabella:

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

Per la maggior parte posso ignorare SEQ_ID poiché non viene utilizzato; PFX_NUM e STK_NUM vengono concatenati insieme per formare lo SKU del prodotto, ma non è questo il problema. Devo essere in grado di attraversare dinamicamente le categorie dal sito. Ad esempio, data la seguente riga:

SEQ_ID: 364867 (ignorato)

PFX_NUM: AMP

STK_NUM: 73121

ECDB2_LVL_1: forniture per ufficio

ECDB2_LVL_1_ID 11

ECDB2_LVL_2: buste, mailer e amp; Forniture di spedizione

ECBD2_LVL_2_ID: 26

ECDB2_LVL_3: Buste

ECDB2_LVL_3_ID: 195

ECDB2_LVL_4: buste per lettere commerciali

ECDB2_LVL_4_ID: 795

ECDB2_LVL_5: (vuoto)

ECDB2_LVL_5_ID: 0

ECDB2_LVL_6: (vuoto)

ECDB2_LVL_6_ID: 0

L'utente dovrebbe essere in grado di navigare attraverso i livelli, ma ciò che mi butta fuori è il sito Web di esempio fornito con i dati (vedi sotto) mostra tutti gli elementi in una sottocategoria a intervalli casuali ... sembra che sia al 3 ° livello (ecdb2_lvl_3) ma per gli oggetti che non hanno il 3 ° livello viene visualizzato a partire dal 2 °. Come puoi vedere dallo schema, hanno tutto insieme in una tabella che elenca i prodotti E tutte le categorie a cui appartengono, invece di qualcosa come una tabella delle categorie autoreferenziali e quindi una tabella dei prodotti che si unisce.

Il problema è che alcuni articoli hanno solo 2 livelli, alcuni come questo ne hanno fino a 4 e ce ne sono alcuni che hanno tutti e 6 - il sito Web di esempio del fornitore, disponibile su http://www.biggestbook.com fa un buon lavoro di ciò che voglio, ma non ho accesso al loro codice, quindi rimango graffiato la mia testa su come esattamente stanno tirando indietro le categorie e le attraversino. Suppongo che abbiano una sorta di bandiera globale per indicare a quale livello sei attualmente (ad esempio 1 per forniture per ufficio, 2 per buste e così via) in modo che possano tenere traccia di quale sia la tua profondità attuale, e quindi controlla ogni sotto-livello per vedere se ci sono più sottocategorie da mostrare, ma sto disegnando uno spazio vuoto quando penso a come gestirlo in modo efficiente. Anche il loro schema di denominazione lascia molto a desiderare, ma è qualcosa che posso affrontare in seguito, se necessario.

Qualcuno ha consigli su come affrontare questo problema? Sto pianificando il negozio in C # / ASP.NET (forse MVC, forse no), quindi gli esempi C # sarebbero più utili, ma posso seguire la maggior parte delle lingue abbastanza facilmente per capirlo.

È stato utile?

Soluzione

Se non ti dispiace usare le funzioni ricorsive per attraversare una tabella delle categorie autoreferenziali, ridisegna definitivamente il database per seguire quel percorso. Si potrebbe pensare che una funzione ricorsiva in SQL potrebbe essere il suicidio delle prestazioni, ma con la creazione di indici adeguati può essere completato in modo estremamente rapido.

Per quanto riguarda il set di dati con cui stai lavorando, puoi vedere dal sito Web di esempio che stanno memorizzando la categoria corrente nella query URL:

Forniture per ufficio > Buste, mailer e amp; Forniture di spedizione > buste
? N = 4294858589 & amp; ...

Forniture per ufficio > Buste, mailer e amp; Forniture di spedizione > Buste > Opuscolo & amp; Buste da catalogo
? N = 4294858588 & amp; ...

Dove N è la categoria corrente. Penserei che il loro database abbia una tabella di ricerca per vedere a quale livello N appartiene. In alternativa, potrebbero semplicemente fare una grande clausola WHERE / ORDER BY come:

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

Se N è una categoria di 2 ° livello, i prodotti che non hanno una categoria di 3 ° livello appariranno per primi poiché null viene in cima quando vengono ordinati.

In una nota a margine, tengono traccia di quale categoria hai attraversato per raggiungere un prodotto nella sessione. Segui una categoria fino a un prodotto fino a quando l'URL non dice qualcosa del tipo? R = 12345. Il pangrattato mostrerà la categoria utilizzata per trovare quel prodotto. Cancella i cookie e aggiorna la pagina, il pangrattato si trasformerà in Biggest Book > Dettagli del prodotto. Ciò non è molto utile per le persone che arrivano sulla pagina da un motore di ricerca poiché non possono quindi selezionare facilmente una categoria per vedere quali prodotti simili sono disponibili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top