¿Cómo asegurar las entradas con rangos de tiempo no superpuestos?

votos
1

Necesito asegurarme de que mi base de datos sólo contiene entradas donde dos o más de sus columnas son únicas. Esto puede lograrse fácilmente con una UNIQUErestricción sobre esas columnas.

En mi caso, necesito prohibir la duplicación sólo para rangos de tiempo superpuestos. La tabla tiene valid_fromy valid_tocolumnas. En algunos casos, uno podría necesitar primero expirar la entrada activa a valid_to = now, y luego insertar una nueva entrada ajustada a valid_from = nowy valid_to = infinity.

Parece que puedo expirar la entrada anterior sin problemas usando UPDATE, pero insertar la nueva entrada parece ser problemático ya que mis columnas base están actualmente UNIQUE, y por lo tanto no pueden ser añadidas de nuevo

Pensé en añadir valid_fromy valid_tocomo parte de la UNIQUErestricción, pero eso sólo haría que la restricción sea más suelta, y permitiría duplicados y rangos de tiempo superpuestos para existir.

Publicado el 10/05/2020 a las 19:31
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Estabas en el camino correcto. Pero la sintaxis de las restricciones de exclusión es ligeramente diferente:

CREATE TABLE registration  (
  tbl_id  integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a   integer NOT NULL
, col_b   integer NOT NULL
, valid_from timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Es posible que tenga que instalar btree_gistprimero el módulo adicional, dependiendo de la definición de la tabla no revelada.

Cada columna tiene que ser listada con su respectivo operador.

Y necesitas un tipo de rango. Suponiendo que timestamp with time zonepara valid_fromy valid_to, la expresión tstzrange(valid_from, valid_to)lo haría.

Relacionado:


Tal vez, un diseño superior sería una relación de uno a muchos entre su registrationmesa y las entradas 1-N en una nueva registration_rangemesa. Y algo de lógica para determinar la entrada actualmente válida (para cualquier momento dado). Depende de más información no revelada.


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more