¿Debo usar un campo de estado o basarme en los cálculos?

7

Un poco largo, pero en general la pregunta es:

  1. ¿Debo tener un campo status en la tabla o debo calcular el estado en memoria a partir de otra información en el registro?
  2. ¿Cuáles son las ventajas y desventajas de cada uno?

PS. Alerta zona gris. Esto no es realmente una pregunta de diseño de base de datos.

Fondo

Tomando el ejemplo de una "Suscripción" (es decir, una suscripción a un servicio en línea, por ejemplo).

Podríamos tener un registro de base de datos como este:

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. Registro inicial

Y digamos que tenemos este registro al inicio de una suscripción

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

De esto observamos:

  1. status nos dice que somos in_trial
  2. La fecha actual es hoy (2016-MAR-12), y hoy está entre trial_starts_at y trial_ends_at , confirma que el status nos dice la verdad.

B. Ahora presume este escenario:

Digamos que el tiempo pasa y ahora es 2016-MAY-05. Esta fecha está fuera del rango de trial_starts_at y trial_ends_at . Por lo tanto, el período de prueba debería haber terminado ahora.

Sin embargo, debido a un error en el sistema (un trabajo en segundo plano que no se ejecutó, por ejemplo), el campo Status todavía se establece en in-trial .

De esto observamos:

  1. El campo status y el 'cálculo' del período de prueba (fecha actual > trial_ends_at ) no están de acuerdo.
  2. La fecha actual es posterior a trial_end .

Ahora tenemos una discrepancia. ¿A quién escuchamos, status o ( trial_starts_at y trial_ends_at )?

Para evitar este problema, consideré evitar el uso de un campo status en absoluto.

¿Crees que es conveniente omitir el campo status ?

    
pregunta Zabba 12.03.2016 - 18:25

1 respuesta

11
  

¿Crees que es conveniente omitir el campo de estado?

Sí. Por varias razones.

  1. El campo de estado es un valor en caché de algo que se puede calcular. El almacenamiento en caché es una optimización, cuya aplicación prematura es un mal conocido. Los cachés están desactualizados y se necesita trabajo para mantenerlos precisos. Si puedes evitar esto es lo mejor. Emplearía el almacenamiento en caché solo si supiera a ciencia cierta que tenía un cuello de botella en el rendimiento y que el almacenamiento en caché solucionó el problema.

  2. Además, es posible que tenga que hacer "a partir de" consultas para realizar informes. El campo de estado no ayudará en absoluto para eso, ya que solo describe la situación a partir de "ahora".

  3. La captura de información sensible a la fecha en la base de datos es, en general, una mala idea: compare una base de datos que almacene su edad y una que almacene su fecha de nacimiento. El primero siempre está desactualizado y se basa en un entendimiento común del "ahora". Si puedes evitar eso (por ejemplo, capturando una fecha de nacimiento) es mejor.

Editar:

Por otro lado, siempre debemos tratar de considerar las cosas desde la perspectiva del negocio o del dominio. En este caso, cuál es la condición autorizada en relación con el estado de una suscripción. Por ejemplo, si todas las suscripciones realmente caducan en la fecha especificada o si existe alguna otra noción de permitir que el estado esté "activo" más allá de la fecha de seguimiento. Estos deben considerarse desde una perspectiva empresarial en lugar de la perspectiva de un programador.

    
respondido por el Erik Eidt 12.03.2016 - 18:33

Lea otras preguntas en las etiquetas