Newsgroup: it.lavoro.professioni.webmaster
Titolo: come gestire un catalogo prodotti con livelli di categorie non omogenee?

ciao a tutti,
ho un dubbio su un nuovo progetto che sto per realizzare (non sono esperto
di php/sql, ma cerco di arrangiarmi).
Mi appresto a creare un sito con db mysql+php in cui i prodotti sono
siddivisi per BRAND.
Ogni BRAND e' suddiviso in LINEE.
Ogni LINEA e' suddivisa in FAMIGLIE.
 
Ho creato quindi le tabelle BRAND, LINEE, FAMIGLIE.
 
Pero' alcuni prodotti sono categorizzabili solo con il BRAND perche' non
hanno una suddivisione in LINEA>FAMIGLIA.
 
Quindi sto cercando di capire come effettuare le varie query sul db per
presentare le pagine BRAND, LINEE, FAMIGLIE.
 
Per ogni prodotto, nel db ho i campi BRAND, LINEA, FAMIGLIA.
 
Pagina BRAND:
effettuo una query sulla tabella BRAND e visualizzo il relativo elenco.
Ogni BRAND visualizzato ha un link alla pagina LINEA a cui passa il
relativo parametro URL.
 
Qui mi si presenta gia' una eccezione: il BRAND X non ha linea ne' famiglia
ma ha solo un prodotto. Quindi il link a lui associato dovrebbe puntare
direttamente alla pagina FAMIGLIA/PRODOTTO, bypassando la pagina LINEA.
Come gestisco questa cosa?
 
Qual'e' l'approccio normale in casi come questo?
 
Ciao e grazie in anticipo per qualsiasi suggerimento.
 
tony


Devi cercare di evitare le eccezioni, altrimenti non ha significato neppure
la parola "catalogo".
Da Wikipedia:
Il catalogo è un elenco ordinato e sistematico di più oggetti della stessa
specie
 
Se questo presupposto non esiste devi creare una tabella a parte per gli
articoli "fuori catalogo".
 
Ciao
Max


Dipende da quali vincoli hanno brand, linee e famiglie oltre a essere 
una figlia dell'altra.
 
Se non ve ne sono (ma probabilmente anche se ve ne sono, dipende poprio 
da come imposti tutta la gestione), allora non serve creare tre tabelle, 
ma usi semplicemente un sistema di categorizzazione multidimensionale.
 
Un metodo pi� semplice � quello dell'adiacenza (tradotto da adjacency 
model), altrimenti detto del parent-id.
 
Un metodo pi� flessibile e meno oneroso in termini poi di performances 
in fase di recupero dei dati per la costruzione dell'albero, ma pi� 
oneroso in termini di manutenzione dell'albero stesso e pi� complesso da 
comprendere, � il modello nidificato (nested set model).
 
Io non riesco a digerire il secondo e mi tengo le limitazioni del primo.
 
Se invece vuoi proprio tenerti le 3 tabelle, ad esempio sulla pagina 
brand metti un controllo per vedere se il brand in questione ha una o 
pi� linee oppure famiglie o direttamente prodotti e quindi costruisci il 
link di conseguenza. Sta a te valutare se per questioni di performances 
� meglio sacrificare l'ottimizzazione del db andando a riportare nella 
tabella brand ad esempio informazioni sul contenuto di famiglie e 
prodotti (ma diventa pi� oneroso da gestire) oppure no. Se le riporti, 
poi con una query avrai tutte le informazioni per costruire la pagina, 
altrimenti per ogni brand dovrai fare una o pi� queries per recuperare 
le info sulle famiglie e sui prodotti e questo potrebbe avere un impatto 
non trascurabile sulle performance. Magari nel tuo caso no, visto che 
stai costruendo sta cosa senza avere esperienza e quindi presumo non 
sar� molto 'grossa'. Se lo �, non andare avanti da solo, rischi di farti 
molto male.
 
 
-- 
Paolo De Dionigi
 
 

 Come gestisco questa cosa?
 
Puoi spiegare di nuovo il problema in modo che sia comprensibile?
 
"ogni brand visualizzato ha un link alla pagina linea" <-- da dove viene 
questo collegamento?
 
Inoltre dici "Ogni BRAND e' suddiviso in LINEE" e poi "BRAND X non ha 
linea ne' famiglia ma ha solo un prodotto", questo da un lato non è 
coerente e dall'altro non rispecchia la relazione entità/proprietà, è il 
prodotto ad avere un brand non il contrario.

 prodotto ad avere un brand non il contrario.
 
In base all'esempio piu' sopra, cliccando il BRAND X appare direttamente
l'unico prodotto appartenente al BRAND X, senza pasare dalle pagine linee e
famiglie.
 
Spero di aver chiarito un pochino.
 
Grazie ancora per le risposte.
 
Tony

 Spero di aver chiarito un pochino.
 
Insomma. Prima di spedire un messaggio lo rileggi?

 hanno una suddivisione in LINEA>FAMIGLIA.
 
Se ho capito bene quello che vuoi, ti basta una organizzazione gerarchica 
a categorie e sottocategorie, facilmente implementabile anche con una 
singola tabella, tipo questa:
 
create table prodotti (
 id serial (integer auto increment o quello che vuole il tuo db),
 parent int (punta all'id del padre),
 type   char ('c'=categoria, 'p'=prodotto, per esempio),
 name   varchar,
 desc   text,
 ...
);
 
A quel punto non ti interessa se si chiamano linee, famiglie, brand o 
supercazzole.
 
Esattamente come la gestione dei file in un normale PC, con cartelle e 
sottocartelle. Alcune categorie avranno solo sottocategorie, altre solo 
prodotti e puo` capitarti anche che abbiano sia sottocategorie che 
prodotti allo stesso livello.
 
Vuoi la lista delle sole categorie di primo livello?
 
select * from prodotti where parent=0 and type='c';
 
Vuoi la lista delle sottocategorie della categoria 1?
 
select * from prodotti where parent=1 and type='c';
 
Vuoi solo i prodotti della categoria 1?
 
select * from prodotti where parent=1 and type='p';
 
Vuoi sia le sottocategoria che i prodotti della categoria 1, con le 
categorie prima dei prodotti?
 
select * from prodotti where parent=1 order by type;
 
Ecc. ecc.
 
Nei template puoi elencare, per esempio, prima le sottocategorie e poi i 
prodotti.
 
Bye.