Come modellare lo stato genitore con singoli stati figlio

3

Sto creando un'applicazione che ti permette di inserire ordini, un ordine ha alcune informazioni di base: chi l'ha ordinato, quale data, ecc. Ha anche un elenco di elementi pubblicitari ordinati. Ogni elemento pubblicitario può (probabilmente il 50% delle volte) avere la propria data di consegna separata da ogni altro elemento pubblicitario, possono anche essere avviati e annullati singolarmente.

Sono alle prese con il modo di modellare lo stato di ciascun ordine e in che modo l'utente dovrebbe essere in grado di modificare tali stati.

Un pensiero che ho avuto è che l'intero Ordine sia solo Aperto / Chiuso e lo abbia calcolato in base al fatto che tutti gli stati degli elementi pubblicitari sono chiusi o meno. L'altra opzione è quella di essere in grado di impostare lo stato in modo esplicito sull'ordine generale, ma lo stato dell'ordine e lo stato dell'elemento pubblicitario potrebbero non essere sincronizzati (perché l'ordine è chiuso se l'elemento pubblicitario è aperto).

Qualcuno ha idea di quale sarebbe un buon approccio qui? Ci sono degli esempi là fuori che trattano questo in modo elegante?

    
posta user258012 31.01.2017 - 00:42
fonte

1 risposta

5

La tua scelta è essenzialmente tra velocità di esecuzione e "unica fonte di verità". Dovrai decidere quale approccio è migliore, in base alla metrica che preferisci.

Il calcolo dello stato di ciascuna fattura va benissimo fino a quando non si verificano potenzialmente problemi di prestazioni perché si eseguono tutte le fatture in un periodo di 30 giorni per generare un report e sono necessari tutti i relativi stati.

La memorizzazione dello stato, come già suggerito, potrebbe potenzialmente causare problemi con lo stato memorizzato che non si sincronizza con lo stato attuale. Nei sistemi in cui tutto viene eseguito tramite un'API che utilizza le transazioni (e non manipolando direttamente i valori nel database), il valore che esce dalla sincronizzazione verrà considerato un errore.

Esistono diversi modi per garantire che questo valore rimanga sincronizzato. Un modo è tramite trigger di database o stored procedure. Un altro modo è quello di mantenere il valore tramite un'API transazionale e solo consentire alle chiamate API di manipolare il database.

Poiché devi calcolare questo stato in entrambi i casi, il mio suggerimento è di scrivere il codice per calcolarlo in base alla fattura e utilizzare questo calcolo nei rapporti. Se trovi che le cose rallentano, è abbastanza facile passare a scrivere questo valore nel database durante le normali operazioni di fatturazione, usando lo stesso codice che hai già scritto.

    
risposta data 31.01.2017 - 00:55
fonte

Leggi altre domande sui tag