Un po 'lungo, ma nel complesso la domanda è:
- Dovrei avere un campo
statusnella tabella, o dovrei calcolare lo stato in memoria da altre informazioni nel record? - Quali sono i pro / contro di ciascuno?
PS. Avviso area grigia. Questa non è davvero una domanda di progettazione di database.
Sfondo
Prendendo l'esempio di un "abbonamento" (ad esempio un abbonamento a un servizio online per esempio.).
Potremmo avere un record del database come questo:
status string # not_started, in_trial, active etc.
subscription_starts_at datetime
trial_starts_at datetime
trial_ends_at datetime
subscription_ends_at datetime
A. Record iniziale
E dì che abbiamo questo record all'inizio di un abbonamento
status in_trial
subscription_starts_at 2016-MAR-01
trial_starts_at 2016-MAR-02
trial_ends_at 2016-APR-30
subscription_ends_at 2017-DEC-28
Da ciò osserviamo:
-
statusci dice che siamoin_trial - La data corrente è oggi (2016-MAR-12), e oggi è tra
trial_starts_atetrial_ends_at, conferma chestatusci sta dicendo la verità.
B. Ora supponi questo scenario:
Diciamo che il tempo passa ed è ora 2016-MAY-05. Questa data non rientra nell'intervallo
trial_starts_at e trial_ends_at . Quindi, il periodo di prova dovrebbe terminare ora.
Tuttavia, a causa di un errore nel sistema (ad esempio, un processo in background che non è stato possibile eseguire),
il campo Status è ancora impostato su in-trial .
Da ciò osserviamo:
-
statuscampo e 'calcolo' del periodo di prova (data corrente >trial_ends_at) non sono d'accordo. - La data corrente è successiva a
trial_end.
Ora abbiamo una mancata corrispondenza. Chi ascoltiamo, status o ( trial_starts_at e trial_ends_at range)?
Per evitare questo problema ho considerato di evitare l'uso di un campo status .
Pensi che sia saggio saltare il campo status ?