Se dai un'occhiata all'organizzazione del database di un cms di e-commerce, resterai disorientato per la sua complessità (io, almeno, sono rimasto disorientato).
Ad un'amica che aveva bisogno di un sito e-commerce particolare, con un momento "a monte" di prenotazione (nei fatti, si tratta di liste nozze online), ho realizzato un sistemino da zero, puntualizzando l'attenzione su ciò di cui aveva veramente bisogno.
Queste sono le tabelle chiave:
Codice: Seleziona tutto
CREATE TABLE acquirenti (
`ID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
Cognome varchar(100) NOT NULL DEFAULT 'temp',
Nome varchar(100) NOT NULL DEFAULT 'temp',
Nazione mediumint(4) unsigned NOT NULL DEFAULT '106',
Comune int(5) unsigned NOT NULL DEFAULT '727',
Provincia int(5) NOT NULL DEFAULT '24',
Indirizzo varchar(255) NOT NULL DEFAULT 'temp',
Cap varchar(5) NOT NULL DEFAULT ' ',
Telefono varchar(50) DEFAULT NULL,
Email varchar(100) DEFAULT NULL,
IP varchar(15) NOT NULL DEFAULT '',
Comune_est varchar(255) DEFAULT NULL,
Provincia_est varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
(I valori di default sono dettati da particolari esigenze; non ho il tempo adesso di modificarli)
(Molti campi fanno rferimento naturalmente a tabelle esterne)
Codice: Seleziona tutto
CREATE TABLE acquisti (
`ID` bigint(13) unsigned NOT NULL,
Acquirente mediumint(8) unsigned NOT NULL,
Sposi mediumint(8) unsigned NOT NULL,
Regalo bigint(13) unsigned NOT NULL,
Prezzo decimal(10,2) unsigned DEFAULT NULL,
Esito enum('pendente','ordinato') NOT NULL DEFAULT 'pendente',
`Timestamp` int(10) unsigned NOT NULL,
Ordine varchar(100) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
(Alcuni campi sono tipici, ma possono essere facilmente modificati)
Codice: Seleziona tutto
CREATE TABLE ordini (
`ID` bigint(13) unsigned NOT NULL AUTO_INCREMENT,
Ordine varchar(100) NOT NULL,
Pagamento enum('paypal','bonifico','carta') NOT NULL,
Annotazioni text,
Firma varchar(255) DEFAULT NULL,
Stato enum('da pagare','da evadere','evaso') NOT NULL DEFAULT 'da pagare',
Importo decimal(10,2) unsigned DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Il riferimento con la tabella degli acquisti sembrerebbe ridondante (campo Ordine), ma ho dovuto adottare questa soluzione perché la tabella acquisti viene popolata prima e c'è bisogno di creare anticipatamente un identificativo univoco...
Il campo Importo si può evitare, in quanto i calcoli sarebbero poi affidati allo scripting in fase di elaborazione dell'ordine.
In pratica, ogni record della tabella ordini raccoglie l'uno o più record relativi agli acquisti fatti dalla stessa persona. Le operazioni di raccolta vengono naturalmente gestite dall'oggetto carrello (anch'esso realizzato in semplicità ex novo).
La tabella ordini può naturalmente essere utilizzata per la gestione e la stampa delle fatture. Partendo dalla sua "maschera", infatti, uno script andrebbe a raccogliere tutti i record della tabella acquisti in cui compare lo stesso identificativo Ordine, effettuando i dovuti calcoli e formattando i risultati.
I puristi troveranno sicuramente molte cose da ridire.
Ma io sono un essenzialista e mi basta che funzioni.