La nostra azienda acquista oggetti di valore di seconda mano (articoli) dai clienti e li rivende per loro. Per fare in modo che il cliente arrivi nel nostro sito e chiedere una spedizione, può scegliere il momento in cui l'addetto alle consegne viene a ritirare il prezioso. Se non sceglie il momento in cui un venditore lo chiama e organizza il tempo per lui. È anche possibile che il cliente chiami e chieda la modifica dell'orario di consegna. Fino ad ora abbiamo appena salvato i dati nella tabella spedizioni in questo modo:
id, item_id, schedule_time, scheduled_by_type, scheduled_by_id, created_at
scheduled_by è polimorfico può essere Clint o Salesman
Se il cliente desidera aggiornare il tempo, dovremmo semplicemente aggiornare la riga di spedizione. Ora l'azienda deve fare un rapporto della programmazione creata ogni giorno (per i bonus al venditore), quindi ho bisogno di mantenere i dati anche per le modifiche. Devo anche mantenere la possibilità di ottenere l'ultimo programma per una spedizione. Mi piacerebbe sapere qual è la migliore pratica per fare questo significato, rendendo i dati più vicini ai concetti di dominio e non duplicando i dati (normalizzandoli). Le prestazioni non sono un grosso problema.
La mia idea di rimuovere schedule_time, scheduled_by_type, scheduled_by_id dalla tabella spedizione e di creare una nuova tabella chiamata shipment_schedules . Inoltre ho aggiunto latest_shipment_schedule_id alla spedizione tabella
Quindi shipment_schedules sarà:
id, shipment_id, schedule_time, scheduled_by_type, scheduled_by_id, created_at
e spedizione saranno:
id, item_id, latest_shipment_schedule_id, created_at
Il mio dilemma è perché non sono questa la soluzione migliore per descrivere il dominio. Perché non è come la spedizione ha davvero molti orari come padre ha molti figli. Le cose importanti sono solo l'ultimo programma. La nuova tabella è solo per il salvataggio della cronologia. Un altro approccio sarebbe mantenere la tabella di spedizione come era prima di creare la nuova tabella e magari rinominarla shipping_history o shipment_changes. Può descrivere meglio il dominio perché hai l'ultimo risultato e un elenco di modifiche che ti hanno portato a questo risultato (come annullare in Word) ma d'altra parte otterrai dati duplicati.
Quale pensi sia l'approccio migliore per farlo. Non deve essere uno di questi alle soluzioni
Usiamo Ruby On Rails 4 e PostgreSQL 9.6 Ma una lingua non ha molta importanza
Un'altra domanda è dalla prospettiva di Ruby On Rails. Voglio aggiornare la spedizione e creare i record shipping_schedule con una singola chiamata dal controller. Lo sto facendo con i callback di Active Record. dovrei utilizzare una richiamata after_create sul modello ShipmentSchedule per aggiornare il modello di spedizione o utilizzare after_update sul modello di spedizione per creare ShipmentSchedule? In altre parole, cosa viene prima di creare lo ShipmentSchedule o l'aggiornamento della spedizione?