[Linuxtrent] Re: Suggerimento per logica applicazione web (postlungo)

  • From: Matteo Ianeselli <m.ianeselli@xxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: 15 Oct 2002 00:26:11 +0200

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


Other related posts: