Il ven, 2002-10-11 alle 20:22, Mario Torre ha scritto: > CREATE TABLE categories > ( > cat_id SERIAL PRIMARY KEY CHECK (cat_id > 0), > __parent_node INTEGER DEFAULT(0), > cat_image BYTEA > ); > > CREATE TABLE products > ( > product_id SERIAL PRIMARY KEY CHECK (product_id > 0), > cat_id INTEGER REFERENCES categories, image > BYTEA > ); Però in questo modo un prodotto può esser figlio di una categoria sola, e hai due tabelle per rappresentare due cose diverse (prodotti e categorie) che però hanno delle parti in comune (il fatto di esser nodi di un albero, o di un grafo orientato). Beccati invece questo schema: -- NODE.TYPE = 0: a PRODUCT -- = 1: a CATEGORY CREATE TABLE NODE ( ID INTEGER PRIMARY KEY, DESCRIPTION TEXT, TYPE INTEGER ); CREATE TABLE NODE2NODE ( ID_NODE INTEGER REFERENCES NODE (ID), ID_PARENT_NODE INTEGER REFERENCES NODE (ID) ); CREATE TABLE PRODUCT ( ID_NODE INTEGER REFERENCES NODE (ID), .... ); CREATE TABLE CATEGORY ( ID_NODE INTEGER REFERENCES NODE (ID), .... ); In pratica: NODE è un generico nodo di un grafo orientato, e NODE.TYPE indica se si tratta di un prodotto (0) oppure una categoria (1). NODE.DESCRIPTION fornisce una descrizione. Qui l'ho messo come testo, tu chiaramente lo metterai come chiave esterna nella tabella localizzata delle descrizioni. NODE2NODE fornisce la relazione padre-figlio tra nodi. Qui ci vorrà un constraint che invochi una funzioncina PL/pgSQL che rilevi i problemi di circolarità. PRODUCT contiene tutti gli altri attributi relativi ad un nodo che è un prodotto, e CATEGORY è la stessa cosa, ma per le categorie. Con PostgreSQL puoi usare l'ereditarietà tra tabelle (via INHERITS) per fare questo in maniera più esplicita, ma se vogliamo rimaner neutri rispetto all'RDBMS conviene usar una chiave esterna su NODE e far una join (o addirittura schiaffare tutto in una tabella sola, ma in genere i prodotti son tanti e le categorie son poche...) Dopodichè, per avere i figli di una certa categoria: SELECT N.DESCRIPTION,N.TYPE FROM NODE N, NODE2NODE N2N WHERE N2N.ID_PARENT_NODE = XXX AND N.ID = N2N.ID_NODE e per avere i padri di un qualsiasi nodo: SELECT N.DESCRIPTION FROM NODE N, NODE2NODE N2N WHERE N2N.ID_NODE = XXX AND N2N.ID_PARENT_NODE = N.ID Se un prodotto può essere in più categorie, le categorie diventano anche un pratico sistema per raggruppare prodotti che condividono caratteristiche comuni (i.e. tutti quelli in offerta speciale, o tutti quelli non disponibili al momento), in maniera del tutto ortogonale alla divisione per tipo di prodotto. -- | \ \ | ___|_ |_ | ianezz a casa sua... :-) | _ \ | \ | _| / / Visita il LinuxTrent a _|_/ _\_| _|____|___|___| http://www.linuxtrent.it -- Per iscriversi (o disiscriversi), basta spedire un messaggio con SOGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx