Tracciamento dei dettagli dell'ordine corretto nel database di commercio durante la modifica di "prodotti"

4

Sto implementando un database di e-commerce. Questo è leggermente diverso rispetto alla maggior parte dei prodotti che sono in vendita per i servizi forniti. Ad esempio, un utente (fornitore) del sistema può definire un servizio per "lavare la tua auto".

Table: Services
--------------------------------------------------
| ID (pk) |      Title       |    Description    |
--------------------------------------------------
     1       Home Services      wash your car

Ho omesso un numero di colonne, ma dovrei comunque essere in grado di esprimere il mio punto.

Un cliente può quindi acquistare Home Services . Quindi ho una tabella orders con un FK per la tabella Services . Materiale di e-commerce standard.

Il problema che ho è cosa succede se il venditore decide di aggiornare leggermente la descrizione o addirittura il titolo? Questo potrebbe avere l'effetto di cambiare l'intero servizio. Per un normale sito di commercio, devi aggiungere un prodotto discreto. Se questo prodotto è cambiato, si creerebbe un nuovo prodotto e si interromperà quello vecchio. Con i pacchetti, dobbiamo consentire gli aggiornamenti in quanto la descrizione è il prodotto e il tono di vendita (forse questo è il mio problema - forse separare i due?) Quindi devo consentire i cambiamenti.

Ad esempio potrebbero cambiare la descrizione in "lava la tua macchina e pulisci la tua casa".

Il problema ovvio con questo è che gli ordini esistenti faranno ancora riferimento allo stesso PK nella tabella dei servizi, ma il servizio ora è diverso.

Mi chiedo quale sia la soluzione migliore per consentire l'aggiunta di modifiche, ma mantenere i dati corretti per gli ordini esistenti. Una soluzione a cui ho pensato è di non aggiornare la riga, ma aggiungerne una nuova e un numero di versione

Table: Services
------------------------------------------------------------------------------
| ID (pk) |      Title       |            Description             |  Version |
------------------------------------------------------------------------------
     1       Home Services     wash your car                           1
     2       Home Services     wash your car and clear your house      2

Ora possiamo accedere alle informazioni corrette per gli ordini precedenti e i clienti esistenti possono acquistare l'opzione dei nuovi servizi di casa.

Questo sembra un modo ragionevole per farlo, ma vuoi vedere se qualcuno sapeva di altre soluzioni?

Un'altra soluzione è quella di consentire aggiornamenti sulla tabella dei servizi, ma poi per ogni ordine, salvare la descrizione e il titolo (analogamente a come a volte negli schemi di commercio il prezzo finale viene salvato direttamente nell'ordine). Il problema che ho con questo è un sacco di dati duplicati in fase di salvataggio.

    
posta Gaz_Edge 30.01.2014 - 21:33
fonte

3 risposte

6

Quello che vuoi fare è "congelare" le informazioni al momento di un ordine.

Quando un cliente fa un ordine, fai una copia della descrizione, del prezzo, del prodotto ecc. nel record dell'ordine.

Ad esempio, il prezzo di un prodotto può cambiare molto. Non vuoi un nuovo record di prodotto per ogni variazione di prezzo. Quindi "congelare" il prezzo nel record dell'ordine.

Una volta che un ordine è stato fatto, molte delle informazioni fanno riferimento all'ordine e non ai prodotti più. Cose come prezzo, descrizione, venditore, IVA, ma anche indirizzo di spedizione vengono memorizzati con l'ordine. Ora è diventato un dato storico. In questo modo, anche quando le cose cambiano, come prezzo, decription o indirizzo puoi sempre vedere quale fosse l'ordine reale. Ad esempio, un cambio di indirizzo di spedizione per un cliente non cambia dove originariamente era stato spedito un ordine.

Vedi come un contratto: prendi il tuo catalogo prodotti, ottieni i dettagli del prodotto e i dettagli del cliente e li metti nel contratto, il prodotto reale e il nome e l'indirizzo del cliente. Non hai stipulato il contratto: il cliente 12345 ha ordinato 3 di prodotto 7 a pagina 25 della versione B del catalogo da maggio 2013 con sconto di vendita al 10% di domenica.

    
risposta data 03.02.2014 - 11:47
fonte
1

For a normal commerce site, you'd add a discrete product. If this product changed, you would create a new product and discontinue the old one.

Nel momento in cui assegni un nuovo ID (che è il PK) alla riga aggiornata ("lava la tua macchina e cancella la tua casa") stai creando logicamente un nuovo prodotto e tutti i tuoi riferimenti FK esistenti si interromperanno.

Table: Services
------------------------------------------------------------------------------
| ID (pk) |      Title       |            Description             |  Version |
------------------------------------------------------------------------------
     1       Home Services     wash your car                           1
     2       Home Services     wash your car and clear your house      2

Questo rappresenta due servizi unici in quanto i loro ID sono diversi e la colonna della versione non ha utilità. Non è possibile tenere traccia del fatto che queste due righe sono in realtà lo stesso servizio che è stato modificato dal provider.

Quello che devi fare è rendere l'ID e la versione una chiave composita e farne riferimento alle altre tue tabelle come FK. In questo modo ogni ordine indicherà una versione specifica del servizio offerto e non causerà alcun conflitto.

Quindi la tabella ORDERS può avere la chiave esterna definita come (ID, VERSION) che punta al composito (ID, VERSION) nella tabella SERVIZI.

per es.

Table: Services
-----------------------------------------------------------------------------------
| ID (ck) |      Title       |            Description             |  Version (ck) |
-----------------------------------------------------------------------------------
     1       Home Services     wash your car                           1
     1       Home Services     wash your car and clear your house      2

In questo caso, anche se i tuoi FK avranno ancora FK diversi per (1,1) e (1,2) puoi fare una query dove cerchi ID = 1 e ottieni l'intera cronologia delle modifiche per il servizio di cui L'ID è 1. E i tuoi ordini continueranno a puntare alla versione corretta a seconda di quando sono stati inseriti.

Questo può o non può essere supportato nel tuo database quindi controlla prima questo.

Alcuni link utili:
MySQL: link
PostgreSQL: link

    
risposta data 30.01.2014 - 22:04
fonte
-1

Penso che manchi qualcosa di fondamentale riguardo alla natura dei prodotti: sono gerarchici. In genere avresti qualcosa di simile:

Brand
   Product
      Size
        Variant
           Production Batch

Quindi urlando al marchio "Dove" hai un prodotto "Soap" in formato "Large" con il "grazioso involucro" fabbricato come il lotto di zillionth nello stabilimento di Springfield.

Il consiglio di amministrazione sarebbe interessato alle prestazioni del marchio, il controllo della qualità sarebbe interessato al lotto di produzione, le vendite in "Dove Soap", il marketing nel "grazioso involucro".

Quindi hai bisogno di una struttura di prodotto gerarchica:

Home Services
     Yard Work
          Mow Lawn
          Clear Snow
     House Work
          Spring Clean
          Put Up Curtains
Educational Services
     Tuition
          Maths Coaching
          Piano Lessons
Personal Services
     Childcare 
          Babysit
          School Run

Quando vendi un nuovo servizio diciamo "Trim Hedge" non modifichi un prodotto esistente ma aggiungi un nuovo prodotto nella categoria "Yard Work". Puoi ereditare tutti i tipi di proprietà dalla categoria padre, ma hai una definizione di prodotto unica che non dovrebbe mai cambiare.

Tutte le cose che cambiano - > l'ora designata, il prezzo concordato e ogni altra condizione speciale appartengono alla "voce dell'ordine".

    
risposta data 04.02.2014 - 08:22
fonte