Un po 'lungo, ma nel complesso la domanda è:
- Dovrei avere un campo
status
nella 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:
-
status
ci dice che siamoin_trial
- La data corrente è oggi (2016-MAR-12), e oggi è tra
trial_starts_at
etrial_ends_at
, conferma chestatus
ci 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:
-
status
campo 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
?