Devo utilizzare un campo Stato o contare su calcoli?

7

Un po 'lungo, ma nel complesso la domanda è:

  1. Dovrei avere un campo status nella tabella, o dovrei calcolare lo stato in memoria da altre informazioni nel record?
  2. 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:

  1. status ci dice che siamo in_trial
  2. La data corrente è oggi (2016-MAR-12), e oggi è tra trial_starts_at e trial_ends_at , conferma che status 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:

  1. status campo e 'calcolo' del periodo di prova (data corrente > trial_ends_at ) non sono d'accordo.
  2. 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 ?

    
posta Zabba 12.03.2016 - 18:25
fonte

1 risposta

11

Do you think that is wise to skip the status field?

Sì. Per diversi motivi.

  1. Il campo dello stato è un valore memorizzato nella cache di qualcosa che può essere calcolato. Il caching è un'ottimizzazione, la cui applicazione prematura è un male noto. I cache non sono aggiornati e richiede lavoro per mantenerli precisi. Se puoi evitarlo, è per il meglio. Utilizzerei il caching solo se sapessi per certo che ho avuto un collo di bottiglia nelle prestazioni e che il caching ha risolto il problema.

  2. Inoltre, potresti dover eseguire "query" per creare report. Il campo dello stato non ti aiuterà affatto, poiché descrive solo la situazione come "adesso".

  3. L'acquisizione di informazioni sensibili alla data nel db è in generale una cattiva idea: confronta un database che memorizza la tua età, con una che memorizza la tua data di nascita. Il primo è sempre obsoleto e si basa su una comprensione comune di "ora". Se puoi evitarlo (ad esempio catturando una data di nascita) è meglio.

Modifica:

D'altra parte, dovremmo sempre cercare di considerare le cose dal punto di vista del business o del dominio. In questo caso, qual è la condizione autorevole relativa allo stato di un abbonamento. Ad esempio se tutte le sottoscrizioni scadono effettivamente alla data specificata o se esiste qualche altra nozione di consentire allo stato di essere "attivo" oltre la data del percorso. Questi devono essere considerati dal punto di vista del business anziché dalla prospettiva di un programmatore.

    
risposta data 12.03.2016 - 18:33
fonte

Leggi altre domande sui tag