[Linuxtrent] Suggerimento per logica applicazione web (post lungo)

  • From: Mario Torre <neugens@xxxxxxxxx>
  • To: LinuxTrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: 11 Oct 2002 20:22:54 +0200

Ciao a tutti!

Sto implementando un sistema di e-commerce in java, open source.
Ancora non ho una release ufficiale, ma credo che per meta' novembre
apriro' una pagina su sourceforge con la prima beta del progetto.

In questo momento sto implementando il carrello prodotti.
Al di la dei dettagli prodotti-categorie (i vari attributi di uno e
dell'altro) che saranno presumibilmente gestiti via xml/beans, ho una
difficolta' nel trovare una logica per la divisione dei prodotti in
diverse sotto-categorie.

Generalmente, ogni prodotto e' inserito in una categoria, quindi
(esempio rapido) una scheda video fa parte della categoria piu' generale
hardware, una matrox e' una scheda video (sarebbe una categoria di
fornitura in realta', ma semplifichiamo), quindi si ha la seguente
sequenza:
        
        computer +----- hardware +
                                 |
                                 +---- video +
                                 |           +-- matrox
                                 |
                                 +---- audio

etc..

Il problema che ho e' banale, si tratta di capire quando finiscono le
categorie e quando cominciano i prodotti.

Ho risolto in questo modo: nel database (PostgreSQL), ho una tabella
categorie ed una prodotti:

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   
        
);

In realta' in queste tabelle sono inseriti solo dati statici, le
descrizioni, i nomi e tutto cio' che varia a seconda della lingua (o del
giorno, come il prezzo!) e' in tabelle separate, per gestire la
localizzazione.

In categories c'e' '__parent_node', che e' un riferimento all'id
(cat_id) del nodo padre della stessa tabella categories. Quindi, nel
caso di prima,

        computer.(cat_id, __parent_id) = (1, 0);
        hardware.(cat_id, __parent_id) = (2, 1);
        video.   (cat_id, __parent_id) = (3, 2);
        
Mentre

        matrox (product_id, cat_id) = (1, 3);

Il codice che determina che cosa si deve vedere fa questo:

        1. lista tutte le categorie di base (__parent_id = 0)
        2. l'utente clicca su una categoria (cat_id = 1)
        3. avviene il listing di tutte le sotto-categorie di cat_id = 1
                                        (select ... __parent_id = 1)
        
Questo viene fatto fin quando select non restituisce null (in java un
ResultSet::next() restituisce false, o zero se non ci sono elementi che
soddisfano la query, e' anche possibile usare ResultSet::wasNull()).

Se ResultSet::next() == 0, viene fatto un controllo nella tabella
prodotti (in pseudo sql):

        SELECT p.product_id FROM products as p WHERE
        p.cat_id='${cat_id}';


Questo approccio funziona bene, ma mi lascia due connessioni al
database, che vorrei evitare.

Secondo voi va bene cosi', o c'e' una soluzione migliore (sicuro che
c'e'! :) che posso usare?

C'e' una sola query (un join? ...) che mi dia gia' il risultato che
cerco?

Grazie dell'aiuto escusate per la lunghezza del post.

Mario



-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con SOGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: