Como garantir entradas com intervalos de tempo não sobrepostos?

votos
1

Eu preciso garantir que minha base de dados contenha apenas entradas onde duas ou mais de suas colunas sejam únicas. Isto pode ser facilmente alcançado com uma UNIQUErestrição sobre essas colunas.

No meu caso, preciso de proibir a duplicação apenas por sobreposição de intervalos de tempo. A tabela tem valid_frome valid_tocolunas. Em alguns casos pode ser necessário primeiro expirar a entrada ativa definindo valid_to = now, e depois inserindo uma nova entrada ajustada valid_from = nowe valid_to = infinity.

Parece que posso expirar a entrada anterior sem problemas usando UPDATE, mas inserir a nova entrada parece ser problemático, uma vez que minhas colunas base estão atualmente UNIQUE, e portanto não podem ser adicionadas novamente

Pensei em adicionar valid_frome valid_tocomo parte da UNIQUErestrição, mas isso só iria tornar a restrição mais solta, e permitir duplicações e sobreposições de intervalos de tempo para existir.

Publicado 10/05/2020 em 19:31
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você estava no caminho certo. Mas a sintaxe para restrições de exclusão é ligeiramente 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 &&)
);

Você pode precisar instalar o módulo adicional btree_gistprimeiro, dependendo da sua definição de tabela não revelada.

Cada coluna precisa de ser listada com o seu respectivo operador.

E você precisa de um tipo de intervalo. Assumindo timestamp with time zonepara valid_frome valid_to, a expressão tstzrange(valid_from, valid_to)o faria.

Relacionada:


Talvez, um design superior seria uma relação de um para muitos entre sua registrationmesa e as entradas 1-N em uma nova registration_rangemesa. E alguma lógica para determinar a entrada atualmente válida (para qualquer ponto no tempo). Depende de mais informação não revelada.


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